将值附加到numpy数组的空numpy数组

时间:2015-10-28 17:06:00

标签: python arrays numpy

我有以下问题,我有一个numpy数组,它有空的numpy数组作为元素,它的形状是2x2但实际上报告为2,2,0这是有道理的。 问题是当你尝试将值附加到任何空的numpy数组时没有任何反应。

MWE:

import numpy as np

a = np.array([[],[],[],[]])
a = np.reshape(a, (2,2,0))

a[0][0] = np.append(a[0][0], 1)
a[0][1] = np.append(a[0][0], [1])

Output:
>>>a[0][0]
array([], dtype=float64)
>>>a[0][1]
array([], dtype=float64)

这意味着没有任何反应。 如何一次向我的2x2 numpy数组添加值?

2 个答案:

答案 0 :(得分:0)

经过修补一段时间后,我意识到答案是显而易见的。

当你试图在4个空的numpy数组中的任何一个上添加一个元素时,你实际上是在破坏2,2,0数组,并且numpy模块会以某种方式阻止你这样做。

如果您想一次添加一个元素,则必须将它们以4个为一组添加到临时1D数组中,然后将临时数组重新整形为(2,2,1)形状,然后附加完全临时的2x2 numpy数组到空的数组,基本上从2,2,0形状变为2,2,1形状。

根据需要重复多次。 MWE:

import numpy as np

a = np.array([[],[],[],[]])
a = np.reshape(a, (2,2,0))
temporary = np.array([])
for i in range(4):
    temporary = np.append(temporary, i)
temporary = np.reshape(temporary, (2,2,1))
a = np.append(a, temporary)
a = np.reshape(a, (2,2,1))
a = np.append(a, temporary)
a = np.reshape(a, (2,2,2))

然后你可以访问元素 一个[0] [0] [0] 一个[0] [0] [1]

奇怪的是,当您将临时数组附加到它时,它会自动将其重新整形为形状(4,)

答案 1 :(得分:0)

a = np.array([[],[],[],[]])制作

array([], shape=(4, 0), dtype=float64)

这是一个由0个元素组成的数组,包含浮点数,形状为(4,0)。您的整形会改变形状,但不会改变元素的数量 - 仍然是2 * 2 * 0 = 0。

这不是包含其他数组的数组。

追加a元素会产生一个形状为(1,)

的1元素数组
In [164]: np.append(a[0,0],1)
Out[164]: array([ 1.])

尝试将其分配回a[0,0]不会做任何事情。实际上我原本预计会出错。但无论如何,它不应该也不能为数组添加一个值,根据定义,它有0个元素。

您必须认为已定义了一个2x2数组,其中每个元素都可以是一个对象,例如另一个数组。要做到这一点,你需要以不同的方式创建数组。

例如:

In [176]: a=np.empty((2,2),dtype=object)
In [177]: a
Out[177]: 
array([[None, None],
       [None, None]], dtype=object)

In [178]: a.fill([])  # lazy way of replacing the None
In [179]: a
Out[179]: 
array([[[], []],
       [[], []]], dtype=object)

Now I have a (2,2) array, where each element can be any Python object, though at the moment they all are empty lists.  As noted in the comment, by using `fill`, each element is the same empty list; change one (in a mutable way), and you change all).

我可以使用np.append创建一个新数组(尽管我一般不建议使用np.append)。 (但要小心a[0,0].append(1),列表操作)。

In [180]: a[0,0]=np.append(a[0,0],1)    
In [181]: a
Out[181]: 
array([[array([ 1.]), []],
       [[], []]], dtype=object)

我可以用2x2数组替换元素:

In [182]: a[0,1]=np.array([[1,2],[3,4]])

或字符串

In [183]: a[1,0]='astring'

或其他清单

In [184]: a[1,1]=[1,2,3]

In [185]: a
Out[185]: 
array([[array([ 1.]), array([[1, 2],
       [3, 4]])],
       ['astring', [1, 2, 3]]], dtype=object)

这个(2,2)对象数组和3或4d浮点数组(2,2,?)之间存在真正的区别。

以下是我在你的回答中执行追加的方式

直接创建(2,2,0)数组:

In [207]: a=np.zeros((2,2,0))

和(2,2,1)只是范围重塑:

In [208]: temporary =np.arange(4).reshape(2,2,1)

In [209]: a
Out[209]: array([], shape=(2, 2, 0), dtype=float64)

In [210]: temporary
Out[210]: 
array([[[0],
        [1]],

       [[2],
        [3]]])

np.append只是concatenate的替代前端。所以我将使用它来明确控制轴。 append适用于坚持按列表术语思考的Python用户。

In [211]: np.concatenate([a,temporary],axis=2)
Out[211]: 
array([[[ 0.],
        [ 1.]],

       [[ 2.],
        [ 3.]]])

In [212]: a1=np.concatenate([a,temporary],axis=2)

In [213]: a2=np.concatenate([a1,temporary],axis=2)

In [214]: a2
Out[214]: 
array([[[ 0.,  0.],
        [ 1.,  1.]],

       [[ 2.,  2.],
        [ 3.,  3.]]])

In [215]: a2.shape
Out[215]: (2, 2, 2)