numpy 如何访问奇数索引元素和偶数索引元素并将其垂直合并

xmq68pz9  于 2022-11-24  发布在  其他
关注(0)|答案(3)|浏览(143)

我从昨天开始学numpy

我目标是

从numpy数组中提取odd index个元素&从numpy数组中提取even index个元素,并垂直并排合并。
假设我有数组

mat = np.array([[1, 1, 0, 0, 0],
                [0, 1, 0, 0, 1],
                [1, 0, 0, 1, 1],
                [0, 0, 0, 0, 0],
                [1, 0, 1, 0, 1]])

我试过的。
--〉我已经完成了转置,因为我必须垂直并排合并。
mat = np.transpose(mat)
所以我

[[1 0 1 0 1]
 [1 1 0 0 0]
 [0 0 0 0 1]
 [0 0 1 0 0]
 [0 1 1 0 1]]

我试过访问奇数索引元素
odd = mat[1::2] print(odd)
给我
[[1 1 0 0 0]----〉错了......应该是[0,1,0,0,1]对吧?我糊涂了
[0 0 1 0 0]]---〉错了...应该是[0,0,0,0,0]对吧?这些是从哪里来的?
我的最终输出应该像

[[0 0 1 1 1]
 [1 0 1 0 0]
 [0 0 0 0 1]
 [0 0 0 1 0]
 [1 0 0 1 1]]

类型-np.nd array

jxct1oxe

jxct1oxe1#

看起来您想要:

mat[np.r_[1:mat.shape[0]:2,:mat.shape[0]:2]].T

输出量:

array([[0, 0, 1, 1, 1],
       [1, 0, 1, 0, 0],
       [0, 0, 0, 0, 1],
       [0, 0, 0, 1, 0],
       [1, 0, 0, 1, 1]])

中级:

np.r_[1:mat.shape[0]:2,:mat.shape[0]:2]

输出:array([1, 3, 0, 2, 4])

wqlqzqxt

wqlqzqxt2#

虽然行的选择是直接的,但有多种组合它们的方式。

In [244]: mat = np.array([[1, 1, 0, 0, 0],
     ...:                 [0, 1, 0, 0, 1],
     ...:                 [1, 0, 0, 1, 1],
     ...:                 [0, 0, 0, 0, 0],
     ...:                 [1, 0, 1, 0, 1]])

奇数行:

In [245]: mat[1::2,:]     # or mat[1::2]
Out[245]: 
array([[0, 1, 0, 0, 1],
       [0, 0, 0, 0, 0]])

偶数行:

In [246]: mat[0::2,:]
Out[246]: 
array([[1, 1, 0, 0, 0],
       [1, 0, 0, 1, 1],
       [1, 0, 1, 0, 1]])

垂直连接行(也可以使用np.vstack):

In [247]: np.concatenate((mat[1::2,:], mat[0::2,:]), axis=0)
Out[247]: 
array([[0, 1, 0, 0, 1],
       [0, 0, 0, 0, 0],
       [1, 1, 0, 0, 0],
       [1, 0, 0, 1, 1],
       [1, 0, 1, 0, 1]])

但既然你想要列-转置:

In [248]: np.concatenate((mat[1::2,:], mat[0::2,:]), axis=0).transpose()
Out[248]: 
array([[0, 0, 1, 1, 1],
       [1, 0, 1, 0, 0],
       [0, 0, 0, 0, 1],
       [0, 0, 0, 1, 0],
       [1, 0, 0, 1, 1]])

我们可以先转置选择:

np.concatenate((mat[1::2,:].T, mat[0::2,:].T), axis=1)

或在索引前转置(注意“:”切片位置的变化):

np.concatenate((mat.T[:,1::2], mat.T[:,0::2]), axis=1)

另一个答案中的r_将切片转换成数组,并将它们连接起来,形成一个行索引数组,这同样有效。

ef1yzkbh

ef1yzkbh3#

所以这里交替是你可以使用的逻辑。

1. convert array to list
 2. Access nested list items based on mat[1::2] - odd & mat[::2] for even
 3. concat them using np.concat at `axis =0` vertically.
 4. Transpose them.

实施。

mat = np.array([[1, 1, 0, 0, 0],
                [0, 1, 0, 0, 1],
                [1, 0, 0, 1, 1],
                [0, 0, 0, 0, 0],
                [1, 0, 1, 0, 1]])
mat_list = mat.tolist() ##############Optional

l_odd = mat_list[1::2]
l_even= mat_list[::2]

mask = np.concatenate((l_odd, l_even), axis=0)
mask = np.transpose(mask)
print(mask)

输出#

[[0 0 1 1 1]
 [1 0 1 0 0]
 [0 0 0 0 1]
 [0 0 0 1 0]
 [1 0 0 1 1]]

检查类型

print(type(mask))

给予

<class 'numpy.ndarray'>

相关问题