numpy 数组的属性

Sud*_*asu 1 python numpy numpy-slicing

假设我们有一个 numpy 数组。

a = np.array([[1,2,3],[4,5,6], [7,8,9]])
Run Code Online (Sandbox Code Playgroud)

现在,如果我想提取第 0 列和第 2 列,则需要执行类似的操作

b = a[:, [0, 2]]
Run Code Online (Sandbox Code Playgroud)

然而,如果我们尝试通过执行来查找 b 的属性b.flags,我们会得到

C_CONTIGUOUS : False
F_CONTIGUOUS : True
Run Code Online (Sandbox Code Playgroud)

可以看到,原本是C_contigious的数组a自动转换为F_contigulous。如果我在单核上运行代码,这通常不会造成任何问题。但是,如果我使用 mpi4py 将数据分散到多个核心,则它必须仅是 C_contigious,否则分散是不正确的。

我的问题是如何避免“b”自动转换为 F_contigious?

谢谢,

SLB

Bat*_*aBe 5

b首先,您可以通过将其复制到新数组来获得 C 连续版本: fixedb = b.copy()

至于为什么会发生这种情况,可能是基本索引和高级索引混合的有效实现。看起来隐藏数组是在从 复制时创建的a,然后b通过使其成为该隐藏数组的 F 连续视图来创建:

a

#array([[1, 2, 3],
#       [4, 5, 6],
#       [7, 8, 9]])

a.base

#None
# means a is the original array

b = a[:, [0, 2]]

#array([[1, 3],
#       [4, 6],
#       [7, 9]])

b.base

#array([[1, 4, 7],
#       [3, 6, 9]])
# b is NOT the original array
# and the original array isn't a either

fixedb = b.copy()
#array([[1, 3],
#       [4, 6],
#       [7, 9]])

fixedb.base

#None
# new array is original, and by default copy makes C-contiguous
Run Code Online (Sandbox Code Playgroud)