NDArray的这种行为正确吗?

时间:2019-07-13 06:19:32

标签: python python-3.x numpy numpy-ndarray

我觉得ndarray对象的行为不正确。我使用下面的代码行创建了一个

c = np.ones((5,0), dtype=np.int32)

下面给出了一些命令和输出

print(c)
[]
c
array([], shape=(5, 0), dtype=int32)
c[0]
array([], dtype=int32)
print(c[0])
[]

就像空数组包含空数组一样。我可以分配值,但该值会丢失,但不会显示。

print(c)
[]
c.shape
(5, 0)
c[0]=10
print(c)
[]
print(c[0])
[]

(5,0)数组是什么意思? a和c有什么区别?

a = np.ones((5,), dtype=np.int32)
c = np.ones((5,0), dtype=np.int32)

对不起,我是Python的新手,所以我的知识非常基础。

2 个答案:

答案 0 :(得分:0)

欢迎使用python。似乎对数组shape有一些误解,尤其是一维数组的形状(形状为(n,)的形状。您看到形状(n,)对应于一维的numpy数组。如果您熟悉线性代数,则此1D数组类似于行向量。它与(n,0)不同。(n, m)表示的是2D numpy数组的形状(因此类似于线性代数中的矩阵。)因此,说一个数组的形状为(n,0)涉及一个具有n行的数组,但每一行都有0列,因此返回一个空数组。如果您确实需要一个向量的数组,则可以键入np.ones((5,))。希望能对您有所帮助。如果需要任何其他帮助,请发表评论。

答案 1 :(得分:0)

In [43]: c = np.ones((5,0), dtype=np.int32)                                                                  
In [44]: c                                                                                                   
Out[44]: array([], shape=(5, 0), dtype=int32)
In [45]: c.size                                                                                              
Out[45]: 0
In [46]: np.ones(5).size                                                                                     
Out[46]: 5

数组的大小或元素数量是其形状的乘积。对于c5*0 = 0c是一个二维数组,不包含任何内容。

如果我尝试为c的列分配值,则会出现错误:

In [49]: c[:,0]=10                                                                                           
---------------------------------------------------------------------------
IndexError                                Traceback (most recent call last)
<ipython-input-49-7baeeb61be4e> in <module>
----> 1 c[:,0]=10

IndexError: index 0 is out of bounds for axis 1 with size 0

您的作业:

In [51]: c[0] = 10                                                                                           

实际上是:

In [52]: c[0,:] = np.array(10) 

之所以可行,是因为c[0,:].shape是(0,),并且形状为()或(1,)的数组可以“广播”到该目标。那是广播的棘手案例。

分配给c的方法更具启发性,我们尝试分配2个值:

In [57]: c[[0,1],:] = np.array([1,2])                                                                        
---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
<ipython-input-57-9ad1339293df> in <module>
----> 1 c[[0,1],:] = np.array([1,2])

ValueError: shape mismatch: value array of shape (2,) could not be broadcast to indexing result of shape (2,0)

源数组是1d,形状为(2,)。目标是形状为(2,0)的2d。

通常,形状为0的数组会令人困惑,因此不应创建。在索引其他数组时,有时会出现它们。但是除了做实验外,不要做一个np.zeros((n,0))