【问题标题】:Why isn't the shape of the array correct?为什么数组的形状不正确?
【发布时间】:2015-12-05 22:59:45
【问题描述】:

我遇到了一些数组操作问题。这是一个例子:

A = np.ones((5,2))
B = np.ones((5,2)) * 2
X = np.zeros((5,1))

C = A[:,0] + B[:,0]
D = C + X

我得到的形状是:

shape(A[:,0]) = (5,)
shape(B[:,0]) = (5,)
shape(X) = (5,1)
shape(C) = (5,)
shape(D) = (5,5)

当我从数组中提取一列时,输出来自形状 (5,),而不是 (5,1)。有什么方法可以纠正这个问题,而不必一直重塑数组?

当我添加 D = C + X 时,结果是一个 (5,5) 数组,但应该是 (5,1)。

【问题讨论】:

  • oneszeros?它们是内置的吗? shape?
  • @taesu oneszeros 来自 numpy
  • 我在问操作,因为他没有提到numpy,反正我批准了你的编辑请求
  • 对不起,我忘了提。它们都来自 numpy。

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


【解决方案1】:

解决方案 1

D = X + C.reshape(shape(X))
shape(D)                        
#(5, 1)
print(D)
#[[ 3.]
# [ 3.]
# [ 3.]
# [ 3.]
# [ 3.]]

解决方案 2(更好) numpy-convert-row-vector-to-column-vector

C = A[:,0:1] + B[:,0:1]

为什么,

CX 有不同的形状,你将行与数字相加,得到一个形状为 (5,5) 的矩阵

print(C)
#[ 3.  3.  3.  3.  3.]

print(X)
#[[ 0.]
# [ 0.]
# [ 0.]
# [ 0.]
# [ 0.]]

【讨论】:

  • 所以每次我从数组中获取一列时,我都必须对其进行整形?还有其他方法吗?为什么是 (5,nothing) 而不是 (5,1)?
  • @Mohamad 是的,您可以使用C = A[:,0:1] + B[:,0:1] 代替C = A[:,0] + B[:,0]
【解决方案2】:

当使用二维数组广播C(5,) 之类的数组时,numpy 根据需要在开头添加维度(1,5)。所以(1,5) + (5,1) => (5,5)

要获得(5,1) 结果,您需要以某种方式将C 设为(5,1) 数组。

C[:,None] + X   # None or np.newaxis is an easy way
C.reshape(5,1) + X  # equivalent

或使用列表或切片索引A

C = A[:,[0]] + B[:,[0]]

A[:,0] 删除一个维度,生成一个(5,) 数组。

注意,MATLAB 将默认尺寸添加到末尾; numpy 因为它有一个默认的 C 订单,所以在开始时这样做。像这样添加维度只需要很少的更改,只需更改 shape

np.sum 这样的函数有一个keepdimensions 参数来避免这种降维。

【讨论】:

    猜你喜欢
    • 2020-01-06
    • 1970-01-01
    • 1970-01-01
    • 2020-11-27
    • 1970-01-01
    • 2021-06-03
    • 2017-01-30
    • 2020-07-11
    • 1970-01-01
    相关资源
    最近更新 更多