преобразование и усечение массива numpy списков в numpy массив проблемы numpy массивов - PullRequest
0 голосов
/ 19 апреля 2020

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

a=np.array([[1,2,3],[3,2,3,4]])
for i in range(len(a)):
    if len(a[i])>3:
        a[i]=a[i][:3]
    a[i]=np.array(a[i])

Теперь я проверил типы a и a [0] и a [1], и все они являются numpy массивами. затем я напечатал форму a, и она была (2,), а не (2,3), как я ожидал, что она будет , хотя длины a [0] и a [1] одинаковы, поэтому я хотел бы знать, почему это происходит и как я могу преобразовать переменную a из массива списков numpy в массив numpy массива numpy с формой (2,3), например, большое спасибо за ваша помощь.

Ответы [ 2 ]

2 голосов
/ 19 апреля 2020

Посмотрите на a на каждом шаге:

In [20]: a=np.array([[1,2,3],[3,2,3,4]])                                                               
In [21]: a                                                                                             
Out[21]: array([list([1, 2, 3]), list([3, 2, 3, 4])], dtype=object)

, поскольку внутренние списки различаются по длине, a - это 1d объект dtype.

In [22]: len(a[0])                                                                                     
Out[22]: 3
In [23]: len(a[1])                                                                                     
Out[23]: 4
In [24]: a[1] = a[1][:3]                                                                               
In [25]: a                                                                                             
Out[25]: array([list([1, 2, 3]), list([3, 2, 3])], dtype=object)

То, что мы изменили a[1], не изменит форму или тип d a.

Это верно, даже если мы изменим списки на массивы:

In [26]: a[0] = np.array(a[0])                                                                         
In [27]: a[1] = np.array(a[1])                                                                         
In [28]: a                                                                                             
Out[28]: array([array([1, 2, 3]), array([3, 2, 3])], dtype=object)

Мы должны использовать что-то вроде stack, чтобы объединить эти массивы в один:

In [29]: np.stack(a)                                                                                   
Out[29]: 
array([[1, 2, 3],
       [3, 2, 3]])

Это новый массив, а не модификация a.

np.array(a) также не переупаковывает a.

Если исходные списки совпадают, результатом будет 2d. '

In [31]: a=np.array([[1,2,3],[3,2,3]])                                                                 
In [32]: a                                                                                             
Out[32]: 
array([[1, 2, 3],
       [3, 2, 3]])

Будьте осторожны с этими потенциально неравными списками - при создании объекта Массивы - ненадежный запасной вариант.

0 голосов
/ 19 апреля 2020

Пожалуйста, проверьте ваш вывод еще раз. Это работает для меня, что вы хотите.

a=np.array([[1,2,3],[3,2,3,4]])
for i in range(len(a)):
    if len(a[i])>3:
        a[i]=a[i][:3]
    a[i]=np.array(a[i])
    print(a[i])

Вывод:

[1 2 3]
[3 2 3]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...