我有一个Numpy形状数组(5,5,3,2)。我想取这个矩阵的元素(1,4),它也是一个形状为(3,2)的矩阵,并向它添加一个元素,这样它就变成了一个(4,2)数组。我使用的代码如下:
import numpy as np
a = np.random.rand(5,5,3,2)
a = np.array(a, dtype = object) #So I can have different size sub-matrices
a[2][3] = np.append(a[2][3],[[1.0,1.0]],axis=0) #a[2][3] shape = (3,2)
我总是得到错误:
ValueError: could not broadcast input array from shape (4,2) into shape (3,2)
我知道np.append
函数返回的形状与a[2][3]
子数组不同,但我认为dtype=object
会解决我的问题。然而,我需要这样做。有什么办法绕过这个限制吗?我也尝试使用insert
函数,但我不知道如何将元素添加到我想要的位置。
确保您了解您所生产的产品。这需要检查形状和数据类型,并可能查看值
In [29]: a = np.random.rand(5,5,3,2)
In [30]: b=np.array(a, dtype=object)
In [31]: a.shape
Out[31]: (5, 5, 3, 2) # a is a 4d array
In [32]: a.dtype
Out[32]: dtype('float64')
In [33]: b.shape
Out[33]: (5, 5, 3, 2) # so is b
In [34]: b.dtype
Out[34]: dtype('O')
In [35]: b[2,3].shape
Out[35]: (3, 2)
In [36]: c=np.append(b[2,3],[[1,1]],axis=0)
In [37]: c.shape
Out[37]: (4, 2)
In [38]: c.dtype
Out[38]: dtype('O')
CCD_ 5也是一个数组。b[2,3]
是索引二维的正确数字方式。
我怀疑您希望b
是一个包含数组(作为对象)的(5,5)
数组,并且您认为可以简单地用(4,2)
数组替换其中一个数组。但是b
构造函数只是将a
的floats
更改为对象,而不更改b
的形状(或4d性质)。
我可以构造一个(5,5)对象数组,并用a
中的值填充它。然后用(4,2)数组替换其中一个值:
In [39]: B=np.empty((5,5),dtype=object)
In [40]: for i in range(5):
...: for j in range(5):
...: B[i,j]=a[i,j,:,:]
...:
In [41]: B.shape
Out[41]: (5, 5)
In [42]: B.dtype
Out[42]: dtype('O')
In [43]: B[2,3]
Out[43]:
array([[ 0.03827568, 0.63411023],
[ 0.28938383, 0.7951006 ],
[ 0.12217603, 0.304537 ]])
In [44]: B[2,3]=c
In [46]: B[2,3].shape
Out[46]: (4, 2)
B
的这个构造函数有点粗糙。我已经回答了关于创建/填充对象数组的其他问题,但我不会在这里花时间来简化这个案例。这只是为了说明的目的。
在object
的数组中,任何元素都可以是数组(或任何类型的对象)。
import numpy as np
a = np.random.rand(5,5,3,2)
a = np.array(a, dtype=object)
# Assign an 1D array to the array element ``a[2][3][0][0]``:
a[2][3][0][0] = np.arange(10)
a[2][3][0][0][9] # 9
然而,a[2][3]
不是一个数组元素,它是一个完整的数组。
a[2][3].ndim # 2
因此,当您执行a[2][3] = (something)
时,您使用的是广播而不是分配元素:numpy试图替换子数组a[2][3]
的内容,但由于形状不匹配而失败。numpy数组的内存布局不允许更改子数组的形状。
编辑:您可以使用嵌套列表,而不是使用numpy数组。这些嵌套列表可以具有任意大小。请注意,与numpy数组相比,内存更高,访问时间也更高。
import numpy as np
a = np.random.rand(5,5,3,2)
a = np.array(a, dtype=object)
b = np.append(a[2][3], [[1.0,1.0]],axis=0)
a_list = a.tolist()
a_list[2][3] = b.tolist()
这里的问题是,您试图将改为制作一个新数组。
new_array = np.append(a[2][3],np.array([[1.0,1.0]]),axis=0)