簡體   English   中英

訪問 numpy ndarray 中的各個列

[英]Accessing individual columns in a numpy ndarray

我有一個形狀為(m, 1,100,4)的 nd-numpy 數組,我想為其訪問內部數組的各個列(形狀: (1,100,4) )。

MWE:例如,假設我有這個:

import numpy as np
X = np.random.randn(2, 1, 5, 4)
    
X
array([[[[-0.40867508,  0.09331783,  1.26134307, -1.18900601],
         [-0.79177772,  0.96738931, -0.33332772,  0.53130287],
         [ 3.67290383,  0.30954936,  0.63221306, -0.64003826],
         [-1.20878773,  1.21499506,  1.84995811,  0.15663168],
         [-0.60648072, -0.30464852, -0.44044224, -4.46482868]]],


       [[[-1.90531392, -0.47108517,  1.21177166,  0.09561669],
         [ 3.21803694,  0.30611821,  1.71334417,  0.73383279],
         [-1.12869017, -0.1497266 , -0.54913676,  0.36704922],
         [ 0.5652546 , -0.75012341, -0.72496611,  1.12428097],
         [-1.19727408, -0.13813127,  2.63948821, -0.37661527]]]])

其中嵌套的 arrays 的形狀為(1,5,4) 然后訪問每個嵌套數組的第一列會返回整個數組:

X[ :, 0]
array([[[-0.40867508,  0.09331783,  1.26134307, -1.18900601],
        [-0.79177772,  0.96738931, -0.33332772,  0.53130287],
        [ 3.67290383,  0.30954936,  0.63221306, -0.64003826],
        [-1.20878773,  1.21499506,  1.84995811,  0.15663168],
        [-0.60648072, -0.30464852, -0.44044224, -4.46482868]],

       [[-1.90531392, -0.47108517,  1.21177166,  0.09561669],
        [ 3.21803694,  0.30611821,  1.71334417,  0.73383279],
        [-1.12869017, -0.1497266 , -0.54913676,  0.36704922],
        [ 0.5652546 , -0.75012341, -0.72496611,  1.12428097],
        [-1.19727408, -0.13813127,  2.63948821, -0.37661527]]])

我的意圖是得到一個元組,這樣:

s,t,u,v = X[first_columns], X[second_columns], X[third_columns], X[fouth_columns]

這樣:

s =[-0.40867508, -0.79177772, 3.67290383, -1.20878773, -0.60648072,
   -1.90531392, 3.21803694, -1.12869017, 0.5652546, -1.19727408]

你正在尋找的是

X[:,0,:,0].ravel()

請注意,使用X的這種形狀,我們不能直接將所需的元素作為一個數組,而是作為一個 2d 矩陣。 因此我們需要reshape為數組形式。

另一個對應:

t = X[:,0,:,1].ravel()
u = X[:,0,:,2].ravel()
v = X[:,0,:,3].ravel()

如果將數組重新整形為適當的方式,則可以直接將其內部 arrays 解包為s,t,u,v 在這種情況下,我們可以轉置和swapaxes以將列放在前面,然后squeeze以移除額外的單軸:

s,t,u,v = X.T.swapaxes(1,3).squeeze()

print(s)
array([[-0.40867508, -0.79177772,  3.67290383, -1.20878773, -0.60648072],
       [-1.90531392,  3.21803694, -1.12869017,  0.5652546 , -1.19727408]])

print(t)
array([[ 0.09331783,  0.96738931,  0.30954936,  1.21499506, -0.30464852],
       [-0.47108517,  0.30611821, -0.1497266 , -0.75012341, -0.13813127]])

我會像這樣訪問數組: X[0,0,:].T ,或者使用循環來覆蓋整個第一維:

for i in range(X.shape[0]):
    a,b,c,d = X[i,0,:].T

說明:通過設置第 1 維和第 2 維(第 1 維為i ,第 2 維為0 ,因為它的大小為 1),您將得到一個 2D 數組。 要提取列,只需應用轉置或.T並分別獲取每一列。

例如:

X = np.random.randn(2, 1, 5, 4)
X
array([[[[-0.5654864 ,  0.83400636, -0.43981782,  0.79797726],
         [-0.53889591,  0.20837148, -0.14120152,  1.4920727 ],
         [ 0.45982834,  0.18474384, -1.47445088, -1.10874298],
         [-1.45259119, -1.72788464, -0.19379806, -0.42558103],
         [-2.16298358,  0.10093486, -0.00730153,  0.00871548]]],

       [[[ 0.60556812, -0.55684663, -0.63648966, -0.34645153],
         [ 0.39557121,  1.50672188, -1.06762611, -1.38979522],
         [-0.06393524, -0.84720836,  0.27615171, -0.31991015],
         [-0.9626267 ,  0.26539901, -1.08703265, -0.97718657],
         [-0.39556868, -0.81102407,  0.33091579, -0.652497  ]]]])

a,b,c,d = X[0,0,:].T
a,b,c,d
(array([-0.5654864 , -0.53889591,  0.45982834, -1.45259119, -2.16298358]),
 array([ 0.83400636,  0.20837148,  0.18474384, -1.72788464,  0.10093486]),
 array([-0.43981782, -0.14120152, -1.47445088, -0.19379806, -0.00730153]),
 array([ 0.79797726,  1.4920727 , -1.10874298, -0.42558103,  0.00871548]))

如果您想一次獲取所有列,只需將數據從[a,1,b,c]重塑為[1,a*b,c]並轉置:

a,b,c,d = X.reshape([1,10,4]).T

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM