numpy:将行附加到单个 3D 数组
numpy: Append row to a individual 3D array
有很多帖子和博客讨论如何使用追加、vstack 或连接操作 2D 数组,但我无法使其在 3D 中工作。
问题假设:
--3D数组的形状为(k, m, 2)。
--k 将是一个已知值
--m 可以从 1 到 n 并且没有预先确定
In [1]: import numpy as np
In [2]: a = np.empty((3, 1, 2))
Out[2]:
array([[[0., 0.]],
[[0., 0.]],
[[0., 0.]]])
In [3]: a[0] = [[5, 6]]
In [4]: a
Out[4]:
array([[[5., 6.]],
[[0., 0.]],
[[0., 0.]]])
In [5]: a[0] = np.vstack((a[0], [[10, 15]]))
Out[5]:
ValueError: could not broadcast input array from shape (2,2) into shape(1,2)
In [6]: a[0] = np.append(a[0], [[10, 15]], axis=0)
Out[6]:
ValueError: could not broadcast input array from shape (2,2) into shape(1,2)
期望的输出是。
array([[[5., 6. ]
[10., 15.]],
[[0., 0.]],
[[0., 0.]]])
如有任何帮助,我们将不胜感激。
澄清:
我正在寻找的输出应该是这样的。
[[[ 5, 6],
[10, 15]],
[[ 0, 0]],
[[ 0, 0]]]
Kyle Booth 的回复接近于:
c = np.insert(a, 1, b, axis=1)
[[[ 5, 6],
[10, 15]],
[[ 0, 0],
[10, 15]],
[[ 0, 0],
[10, 15]]]
这就是你想要的:
import numpy as np
a = np.array([[[5., 6.]],
[[0., 0.]],
[[0., 0.]]])
b = np.array([[10, 15]])
c = np.insert(a,1,b,0)
print c
[[[ 5. 6.]]
[[ 10. 15.]]
[[ 0. 0.]]
[[ 0. 0.]]]
这不是有效的 numpy
数组。
[[[ 5, 6],
[10, 15]],
[[ 0, 0]],
[[ 0, 0]]]
它有3个'rows',一个是(2,2)形,其他是(1,2)形。
如果我将其作为列表列表输入
In [40]: x = np.array([[[5,6],[10,15]],[[0,0]],[[0,0]]])
Out[40]: array([[[5, 6], [10, 15]], [[0, 0]], [[0, 0]]], dtype=object)
我得到一个形状为 (3,)、dtype object
的数组,因为它无法创建普通的 3d 数组。这 3 个对象中的每一个都只是列表的列表。将其包装在 np.array
中并没有多大作用。
如果我列出 3 个二维数组可能更有意义:
In [45]: [np.array(y) for y in x]
Out[45]:
[array([[ 5, 6],
[10, 15]]),
array([[0, 0]]),
array([[0, 0]])
]
问题不在于 3D,而在于不规则阵列,不同大小的阵列。
有很多帖子和博客讨论如何使用追加、vstack 或连接操作 2D 数组,但我无法使其在 3D 中工作。
问题假设:
--3D数组的形状为(k, m, 2)。
--k 将是一个已知值
--m 可以从 1 到 n 并且没有预先确定
In [1]: import numpy as np
In [2]: a = np.empty((3, 1, 2))
Out[2]:
array([[[0., 0.]],
[[0., 0.]],
[[0., 0.]]])
In [3]: a[0] = [[5, 6]]
In [4]: a
Out[4]:
array([[[5., 6.]],
[[0., 0.]],
[[0., 0.]]])
In [5]: a[0] = np.vstack((a[0], [[10, 15]]))
Out[5]:
ValueError: could not broadcast input array from shape (2,2) into shape(1,2)
In [6]: a[0] = np.append(a[0], [[10, 15]], axis=0)
Out[6]:
ValueError: could not broadcast input array from shape (2,2) into shape(1,2)
期望的输出是。
array([[[5., 6. ]
[10., 15.]],
[[0., 0.]],
[[0., 0.]]])
如有任何帮助,我们将不胜感激。
澄清:
我正在寻找的输出应该是这样的。
[[[ 5, 6],
[10, 15]],
[[ 0, 0]],
[[ 0, 0]]]
Kyle Booth 的回复接近于:
c = np.insert(a, 1, b, axis=1)
[[[ 5, 6],
[10, 15]],
[[ 0, 0],
[10, 15]],
[[ 0, 0],
[10, 15]]]
这就是你想要的:
import numpy as np
a = np.array([[[5., 6.]],
[[0., 0.]],
[[0., 0.]]])
b = np.array([[10, 15]])
c = np.insert(a,1,b,0)
print c
[[[ 5. 6.]]
[[ 10. 15.]]
[[ 0. 0.]]
[[ 0. 0.]]]
这不是有效的 numpy
数组。
[[[ 5, 6],
[10, 15]],
[[ 0, 0]],
[[ 0, 0]]]
它有3个'rows',一个是(2,2)形,其他是(1,2)形。
如果我将其作为列表列表输入
In [40]: x = np.array([[[5,6],[10,15]],[[0,0]],[[0,0]]])
Out[40]: array([[[5, 6], [10, 15]], [[0, 0]], [[0, 0]]], dtype=object)
我得到一个形状为 (3,)、dtype object
的数组,因为它无法创建普通的 3d 数组。这 3 个对象中的每一个都只是列表的列表。将其包装在 np.array
中并没有多大作用。
如果我列出 3 个二维数组可能更有意义:
In [45]: [np.array(y) for y in x]
Out[45]:
[array([[ 5, 6],
[10, 15]]),
array([[0, 0]]),
array([[0, 0]])
]
问题不在于 3D,而在于不规则阵列,不同大小的阵列。