Вопрос: Доступ к столбцу массива NumPy структурированных массивов


Мне был задан многомерный массив numpy, x это выглядит так:

array([ array([  398.24475098,  -196.1497345 ,  -110.79341125, ..., -1937.22399902,
       -6158.89355469,  1742.84399414], dtype=float32),
       array([   32.27750397,  -171.73371887,  -342.6328125 , ..., -4727.4296875 ,
       -4727.4296875 , -2545.10375977], dtype=float32),
       array([  785.83660889,  -234.88890076,   140.49914551, ..., -7982.19482422,
       -2127.640625  , -1434.77160645], dtype=float32),
       ...,
       array([   181.93313599,   -146.41413879,   -416.02978516, ...,
        -4517.796875  ,  10491.84570312,  -6604.39550781], dtype=float32),
       array([ -1.37602341e+02,   1.71733719e+02,   7.13068867e+00, ...,
         8.60104688e+03,   1.39115127e+04,   3.31622314e+03], dtype=float32),
       array([   453.17272949,    152.49285889,    260.41452026, ...,
        19061.60742188,  11232.8046875 ,   7312.13964844], dtype=float32)], dtype=object)

Я пытаюсь получить доступ к каждому столбцу (в частности, я пытаюсь принять стандартное отклонение каждого столбца). я нашел этот ответ , и я попробовал,

>>> x[:,0]

Но это привело к ошибке:

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
IndexError: too many indices for array

Можно ли преобразовать этот структурированный массив в простой массив двумерных чисел, чтобы получить доступ к столбцам? Или есть хороший способ прямого доступа к этим столбцам?

Спасибо!

редактировать

Дополнительная информация об этом массиве:

>>> x.shape
(8685,)
>>> x[0].shape  # Same for x[1], x[2], ...
(3524,)

Если это какая-то помощь, я использовал tree2array функции в root_numpy  пакет для создания этого массива.


4


источник


Ответы:


не уверен, как вы это делаете, но, похоже, для меня это работает прямо из подсказки

a=np.zeros((2,6),dtype=np.float32)
>>> a
array([[ 0.,  0.,  0.,  0.,  0.,  0.],
       [ 0.,  0.,  0.,  0.,  0.,  0.]], dtype=float32)
>>> a[:,2]=1
>>> a
array([[ 0.,  0.,  1.,  0.,  0.,  0.],
       [ 0.,  0.,  1.,  0.,  0.,  0.]], dtype=float32)

0



«Или есть хороший способ прямого доступа к этим столбцам?» - Да, есть!

Предположим, вы хотите получить i-й столбец этого массива, не преобразовывая его сначала в 2D-массив (который, однако, является более понятным подходом).

>>> col = np.array([row[i] for row in x])

Однако я бы предложил сначала преобразовать его в 2D-массив следующим образом:

columns = x[0].shape[0] # Note: Number of elements in each array should be the same
rows = len(x)
x_flat = x.flatten()
x_2d = x_flat.reshape((rows, columns))
col = x_2d[:, i]

0



Решением может быть преобразование структурированного массива в список, а затем создание стандартного массива из этого:

np.array(x.tolist())

Увидеть этот вопрос  для справки.


0



С помощью этого ответа мне удалось заставить работать:

Как преобразовать массив массивов в многомерный массив в Python? ,

>>> y = np.stack(x)
>>> y
array([[  3.98244751e+02,  -1.96149734e+02,  -1.10793411e+02, ...,
         -1.93722400e+03,  -6.15889355e+03,   1.74284399e+03],
       [  3.22775040e+01,  -1.71733719e+02,  -3.42632812e+02, ...,
         -4.72742969e+03,  -4.72742969e+03,  -2.54510376e+03],
       [  7.85836609e+02,  -2.34888901e+02,   1.40499146e+02, ...,
         -7.98219482e+03,  -2.12764062e+03,  -1.43477161e+03],
       ...,
       [  1.81933136e+02,  -1.46414139e+02,  -4.16029785e+02, ...,
         -4.51779688e+03,   1.04918457e+04,  -6.60439551e+03],
       [ -1.37602341e+02,   1.71733719e+02,   7.13068867e+00, ...,
          8.60104688e+03,   1.39115127e+04,   3.31622314e+03],
       [  4.53172729e+02,   1.52492859e+02,   2.60414520e+02, ...,
          1.90616074e+04,   1.12328047e+04,   7.31213965e+03]], dtype=float32)
>>> y[:,0]
array([ 398.24475098,   32.27750397,  785.83660889, ...,  181.93313599,
       -137.6023407 ,  453.17272949], dtype=float32)

0