簡體   English   中英

將多個切片傳遞給 numpy 數組

[英]Passing multiple slices to a numpy array

我有一個二維 NumPy 陣列。 我想切出長度不等的列子集,並將它們放在一個數組中,其中 rest 的值由nan填充。 也就是說在:

data = np.random.normal(size=(100,4))

我想從[75, 33, 42, 54]索引到結束。 也就是說,行索引從 75 到第 0 列的末尾,第 33 行到第 1 列的末尾,依此類推。

我試過data[[slice(75,100),slice(33,100)],:]但它沒有用。

您可以通過創建一個掩碼來做到這一點,對於您想要成為np.nan的索引使用True ,否則使用False

import numpy as np
data = np.random.normal(size=(5,4))
b = np.array([0, 1, 2, 3])
mask = np.arange(len(data))[:, None] < b
data[mask] = np.nan
data

Output:

 array([[-0.53306108,         nan,         nan,         nan],
       [ 1.32282687,  0.83204007,         nan,         nan],
       [-1.07143908,  0.12972517, -0.4783274 ,         nan],
       [ 0.39686727, -1.20532247, -2.17043218,  0.74859079],
       [ 1.82548696,  0.98669461, -1.17961517, -0.7813723 ]])

這個對我有用:

data = np.random.normal(size=(100,4))
slices_values = [75, 33, 42, 54] # You name your slices here

slices = [] # In this list you will keep the slices

for i in slices_values:
    x = slice(i, 100)
    slices.append(data[x])

現在您可以確認每個切片的形狀:

slices[0].shape # (25, 4)
slices[1].shape # (67, 4)
slices[2].shape # (58, 4)
slices[3].shape # (46, 4)

很難找出預期的結果,但如果是 IIUC,一種方法是創建一個數組並使用循環填充它:

data = np.random.normal(size=(5, 4))
ids = np.array([2, 1, 2, 3])

def test(data, ids):
    arr = np.empty_like(data)
    for i, j in enumerate(ids):
        arr[:j, i] = data[:j, i]
        arr[j:, i] = np.nan
    return arr

res = test(data, ids)

# [[ 0.1768507210788626   2.3777541249700573   0.998732857053734   -1.3101507969798436 ]
#  [ 0.18018992116935298                  nan -1.443125868756967   -1.3992855573400653 ]
#  [                 nan                  nan                  nan -0.2319322879433409 ]
#  [                 nan                  nan                  nan                  nan]
#  [                 nan                  nan                  nan                  nan]]

或者:

def test(data, ids):
    arr = np.empty_like(data)
    for i, j in enumerate(ids):
        arr[:j, i] = np.nan
        arr[j:, i] = data[j:, i]
    return arr

# [[                nan                 nan                 nan                 nan]
#  [                nan -1.7647540193678475                 nan                 nan]
#  [ 0.8203539992532282  1.2952993197746814  0.9421974218807785                 nan]
#  [-0.6313979666045816 -0.6421770233773478 -0.3816716009896775 -1.7634440039930654]
#  [ 1.611668212682313  -0.878108388861928  -0.4985770669099582  0.9072434022928676]]

為了獲得可重復的結果,我播種了隨機生成器:

np.random.seed(0)

然后創建源數組:

data = np.random.normal(size=(100,4))

我定義為的起始索引列表:

ind = [75, 33, 42, 54]

第一步是計算 output 列的最大長度:

ml = max([ 100 - i for i in ind ])

然后您可以生成 output 數組為:

result = np.array([ np.pad(data[rInd:, i[0]], (0,  ml - 100 + rInd),
    constant_values = np.nan) for i, rInd in np.ndenumerate(ind) ]).T

這段代碼:

  • 獲取源數組的所需切片( data[rInd:, i[0]] ),
  • 用所需數量的NaN值填充它,
  • 創建一個Numpy數組(到目前為止,每一行都包含目標應包含的內容),
  • 所以剩下的唯一步驟就是轉置這個數組。

對於我的源數據,結果是:

array([[-1.30652685,  0.03183056,  0.92085882, -0.04225715],
       [ 0.66638308, -0.20829876, -1.03424284,  0.48148147],
       [ 0.69377315,  0.4393917 , -0.4555325 ,  0.23218104],
       [-1.12682581,  0.94447949, -0.6436184 , -0.49331988],
       [-0.04217145, -0.4615846 , -1.10438334,  0.7811981 ],
       [-0.71960439, -0.82643854, -1.29285691,  0.67690804],
       [-1.15735526, -1.07993151,  0.52327666, -0.29779088],
       [-0.70470028,  1.92953205,  2.16323595,  1.07961859],
       [ 0.77325298,  0.84436298,  1.0996596 , -0.57578797],
       [-1.75589058,  0.31694261, -0.02432612,  0.69474914],
       [ 1.0685094 , -0.65102559,  0.91017891,  0.61037938],
       [-0.44092263, -0.68954978, -0.94444626, -0.0525673 ],
       [ 0.5785215 , -1.37495129,  2.25930895,  0.08842209],
       [ 1.36453185, -1.60205766, -0.46359597, -2.77259276],
       [-1.84306955,  1.5430146 ,  0.15650654, -0.39095338],
       [ 0.69845715, -1.1680935 , -1.42406091,  2.06449286],
       [-0.01568211,  0.82350415, -1.15618243,  1.53637705],
       [-0.26773354, -0.23937918,  0.42625873,  1.21114529],
       [ 0.84163126, -1.61695604, -0.13288058, -0.48102712],
       [ 0.64331447, -0.09815039,  1.15233156,  1.13689136],
       [-1.69810582, -0.4664191 ,  0.52106488,  0.37005589],
       [ 0.03863055,  0.37915174,  0.69153875, -0.6801782 ],
       [ 1.64813493, -0.34598178, -1.5829384 , -1.34671751],
       [-0.35343175,  0.06326199, -0.59631404,  1.07774381],
       [ 0.85792392, -0.23792173,  0.52389102,  0.09435159],
       [        nan,  0.41605005,  0.39904635, -0.10730528],
       [        nan, -2.06998503, -0.65240858, -0.89091508],
       [        nan, -0.39727181, -2.03068447,  2.2567235 ],
       [        nan, -1.67600381, -0.69204985, -1.18894496],
       [        nan, -1.46642433, -1.04525337,  0.60631952],
       [        nan, -0.31932842, -0.62808756,  1.6595508 ],
       [        nan, -1.38336396, -0.1359497 , -1.2140774 ],
       [        nan, -0.50681635, -0.39944903,  0.15670386],
       [        nan,  0.1887786 , -0.11816405, -1.43779147],
       [        nan,  0.09740017, -1.33425847, -0.52118931],
       [        nan,  0.39009332, -0.13370156,  0.6203583 ],
       [        nan, -0.11610394, -0.38487981,  0.33996498],
       [        nan,  1.02017271, -0.0616264 , -0.39484951],
       [        nan,  0.60884383,  0.27451636, -0.99312361],
       [        nan,  1.30184623, -0.15766702,  0.49383678],
       [        nan, -1.06001582,  0.74718833,  0.88017891],
       [        nan,  0.58295368, -2.65917224, -1.02250684],
       [        nan,  1.65813068, -0.6840109 , -1.47183501],
       [        nan, -0.46071979, -0.68783761, -0.2226751 ],
       [        nan, -0.15957344, -0.36469354, -0.76149221],
       [        nan, -0.73067775, -0.76414392,  0.85255194],
       [        nan, -0.28688719, -0.6522936 ,         nan],
       [        nan, -0.81299299, -0.47965581,         nan],
       [        nan, -0.31229225,  0.93184837,         nan],
       [        nan,  0.94326072, -0.19065349,         nan],
       [        nan, -1.18388064,  0.28044171,         nan],
       [        nan,  0.45093446,  0.04949498,         nan],
       [        nan, -0.4533858 , -0.20690368,         nan],
       [        nan, -0.2803555 , -2.25556423,         nan],
       [        nan,  0.34965446, -0.98551074,         nan],
       [        nan, -0.68944918,  0.56729028,         nan],
       [        nan, -0.477974  , -0.29183736,         nan],
       [        nan,  0.00377089,  1.46657872,         nan],
       [        nan,  0.16092817,         nan,         nan],
       [        nan, -1.12801133,         nan,         nan],
       [        nan, -0.24945858,         nan,         nan],
       [        nan, -1.57062341,         nan,         nan],
       [        nan,  0.38728048,         nan,         nan],
       [        nan, -1.6567151 ,         nan,         nan],
       [        nan,  0.16422776,         nan,         nan],
       [        nan, -1.61647419,         nan,         nan],
       [        nan,  1.14110187,         nan,         nan]])

請注意,上面的代碼包含i[0] ,因為np.ndenumerate作為第一個結果返回索引元組

由於data是一維數組,我們只對第一個索引感興趣,所以在i之后我放了[0]

暫無
暫無

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

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