对 numpy 数组进行子排列时保持维度的最佳方法是什么?
What is the best way to keep dimensionality when subarraying numpy arrays?
假设我有一个标准的 numpy 数组,例如
a = np.arange(6).reshape((2,3))
当我对数组进行子排列时,通过执行
这样的任务
a[1, :]
我会失去维度,它会变成一维并打印,array([3, 4, 5])
当然,列表是二维的,您最初想要保持维度。所以我必须做一个乏味的任务,比如
b=a[1, :]
b.reshape(1, b.size)
为什么numpy在子数组化的时候会降维?
保持维度的最佳方法是什么,因为 a[1, :].reshape(1, a.size)
会中断?
只使用切片而不是索引,形状将被保留:
a[1:2]
虽然我同意 John Zwinck 的回答,但我想提供一个替代方案,以防万一,无论出于何种原因,您被迫使用索引(而不是切片)。
OP 说“a[1, :].reshape(1, a.size)
会中断”:
您可以像这样向 numpy 数组添加维度:
b = a[1]
# array([3, 4, 5]
b = a[1][np.newaxis]
# array([[3, 4, 5]])
(请注意 np.newaxis
是 None
,但使用 np.newaxis
可读性更高)
正如评论(@PaulPanzer 和@Divakar)中所指出的,实际上有很多方法可以完成同样的事情(同样,使用索引而不是切片):
这些不制作副本(每个影响中更改的数据a
)
a[1, None]
a[1, np.newaxis]
a[1].reshape(1, a.shape[1]) # Use shape, not size
这个确实复制了一份(数据独立于a
)
a[[1]]
假设我有一个标准的 numpy 数组,例如
a = np.arange(6).reshape((2,3))
当我对数组进行子排列时,通过执行
这样的任务a[1, :]
我会失去维度,它会变成一维并打印,array([3, 4, 5])
当然,列表是二维的,您最初想要保持维度。所以我必须做一个乏味的任务,比如
b=a[1, :]
b.reshape(1, b.size)
为什么numpy在子数组化的时候会降维?
保持维度的最佳方法是什么,因为 a[1, :].reshape(1, a.size)
会中断?
只使用切片而不是索引,形状将被保留:
a[1:2]
虽然我同意 John Zwinck 的回答,但我想提供一个替代方案,以防万一,无论出于何种原因,您被迫使用索引(而不是切片)。
OP 说“a[1, :].reshape(1, a.size)
会中断”:
您可以像这样向 numpy 数组添加维度:
b = a[1]
# array([3, 4, 5]
b = a[1][np.newaxis]
# array([[3, 4, 5]])
(请注意 np.newaxis
是 None
,但使用 np.newaxis
可读性更高)
正如评论(@PaulPanzer 和@Divakar)中所指出的,实际上有很多方法可以完成同样的事情(同样,使用索引而不是切片):
这些不制作副本(每个影响中更改的数据a
)
a[1, None]
a[1, np.newaxis]
a[1].reshape(1, a.shape[1]) # Use shape, not size
这个确实复制了一份(数据独立于a
)
a[[1]]