python numpy.形状给出不一致的响应-为什么?

lfapxunr  于 2023-01-01  发布在  Python
关注(0)|答案(5)|浏览(143)

为什么这个程序

import numpy as np

c = np.array([1,2])
print(c.shape)
d = np.array([[1],[2]]).transpose()
print(d.shape)

给予

(2,)
(1,2)

作为它的输出,不是应该

(1,2)
(1,2)

我在python2.7.3和python3.2.3中都有这个

gev0vcfq

gev0vcfq1#

当你调用一个ndarray.shape属性时,你会得到一个元组,它的元素数和数组的维数一样多,长度,也就是行数,是第一维(shape[0]

  • 从一个数组开始:c=np.array([1,2])。这是一个普通的一维数组,所以它的形状是一个1元素的元组,shape[0]是元素的数量,所以c.shape = (2,)
  • c=np.array([[1,2]])为例,这是一个二维数组,只有一行,第一行也是唯一一行是[1,2],它有两列,因此c.shape=(1,2)len(c)=1
  • 考虑c=np.array([[1,],[2,]]),另一个2行1列的二维数组:c.shape=(2,1)len(c)=2
  • 考虑d=np.array([[1,],[2,]]).transpose():该阵列与np.array([[1,2]])相同,因此其形状为(1,2)

另一个有用的属性是.size:这是所有维度上的元素数,对于一个数组c``c.size = np.product(c.shape).
有关形状的详细信息,请参见文档。

4bbkushb

4bbkushb2#

len(c.shape)是阵列的"深度"。
对于c,数组只是一个列表(向量),深度为1。
对于d,数组是列表的列表,深度为2。
注:

c.transpose()
# array([1, 2])

其不是d,因此该行为不是不一致的。

dt = d.transpose()
# array([[1],
#        [2]])
dt.shape # (2,1)
x8diyxa7

x8diyxa73#

快速修复:检查. ndim属性-如果它是2,那么. shape属性将按您预期的方式工作。
原因:如果. ndim属性为2,则numpy报告符合约定的形状值;如果. ndim属性为1,则numpy仅以不同的方式报告形状。
更多对话:当你给np. array传递一个列表的列表时,. shape属性将符合矩阵维数的标准概念:(行、列)。
如果你只给np.array传递一个列表,那么numpy就不会认为它手上有一个矩阵,而是以一种不同的方式报告形状。
问题是:numpy认为它有一个矩阵,还是它认为它手上有别的东西。

ha5z0ras

ha5z0ras4#

transpose不更改数组的维数。如果为c.ndim == 1,则为c.transpose() == c。请尝试:

c = np.array([1,2])
print c.shape
print c.T.shape
c = np.atleast_2d(c)
print c.shape
print c.T.shape
z9gpfhce

z9gpfhce5#

来自Matlab,我也发现一维数组不组织为(row_count,colum_count)很困难
我的函数必须一致地响应一维ndarray,如[x1,x2,x3]或数组列表[[x1,x2,x3],[x1,x2,x3],[x1,x2,x3]]。
这对我很有效:

dim = np.shape(subtract_matrix)[-1]

拾取最后一个维度。

相关问题