将numpy数组附加到元素中

时间:2016-07-20 14:10:08

标签: python arrays numpy multidimensional-array

我有一个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函数,但我不知道如何在我想要的位置添加元素。

3 个答案:

答案 0 :(得分:1)

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)时,您正在使用broadcasting而不是分配元素: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()

答案 1 :(得分:1)

确保您了解自己所制作的内容。这需要检查形状和dtype,并可能查看值

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')

b[2][3]也是一个数组。 b[2,3]是索引2维的正确方法。

我怀疑您希望b成为包含数组(作为对象)的(5,5)数组,并且您认为您可以简单地用(4,2)数组替换其中一个数组。但b构造函数只是将floats a更改为对象,而不更改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的这个构造函数有点粗糙。我已经回答了有关创建/填充对象数组的其他问题,但我不打算花时间来简化这种情况。它仅用于说明目的。

答案 2 :(得分:0)

这里的问题是你尝试分配给[2] [3] 改为创建一个新数组。

new_array = np.append(a[2][3],np.array([[1.0,1.0]]),axis=0)