将numpy数组追加到元素中



我有一个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构造函数只是将afloats更改为对象,而不更改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)

相关内容

  • 没有找到相关文章

最新更新