我觉得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的新手,所以我的知识非常基础。
答案 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
数组的大小或元素数量是其形状的乘积。对于c
,5*0 = 0
。 c
是一个二维数组,不包含任何内容。
如果我尝试为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))
。