Я новичок в Python, и в этом коде есть что-то, чего я не понимаю:

import numpy as np

a_list = []
sub_list = ["apple", "banana", "cherry"]

a_list.append(sub_list)

print(type(a_list))
print(type(a_list[0]))
print(type(sub_list))

array = np.array(a_list)

print(type(array))
print(type(array[0]))
print(type(sub_list))
print(array[0])

Когда я запускаю его, я получаю такой результат:

<class 'list'>
<class 'list'>
<class 'list'>
<class 'numpy.ndarray'>
<class 'numpy.ndarray'>
<class 'list'>
['apple' 'banana' 'cherry']

Почему type(array[0]) тоже numpy.ndarray? Разве это не должен быть список?

1
VansFannel 18 Дек 2019 в 21:04

1 ответ

Лучший ответ
In [36]:  
    ...: a_list = [] 
    ...: sub_list = ["apple", "banana", "cherry"] 
    ...:  
    ...: a_list.append(sub_list)                                                
In [37]: arr = np.array(a_list)                                                 
In [38]: a_list                                                                 
Out[38]: [['apple', 'banana', 'cherry']]
In [39]: arr                                                                    
Out[39]: array([['apple', 'banana', 'cherry']], dtype='<U6')
In [40]: arr[0]                                                                 
Out[40]: array(['apple', 'banana', 'cherry'], dtype='<U6')
In [41]: arr.shape                                                              
Out[41]: (1, 3)

np.array пытается создать многомерный массив из своих входов. a_list - это вложенный список, из которого он может создать 2d-массив. arr[0] - это одномерный массив, выбранный из arr.

arr не является массивом списков. Это массив строковых элементов.

Можно создать массив, содержащий списки:

In [42]: arr1 = np.empty(1, object)                                             
In [43]: arr1                                                                   
Out[43]: array([None], dtype=object)
In [44]: arr1[0]=sub_list                                                       
In [45]: arr1                                                                   
Out[45]: array([list(['apple', 'banana', 'cherry'])], dtype=object)
In [46]: arr1[0]                                                                
Out[46]: ['apple', 'banana', 'cherry']

Но для большинства целей это немного лучше, чем список, a_list, а в некоторых случаях и хуже (например, .append к нему нельзя).

Классический случай создания 2d-массива из вложенных списков:

In [47]: np.array([[1,2,3],[4,5,6]])                                            
Out[47]: 
array([[1, 2, 3],
       [4, 5, 6]])
In [48]: _.shape                                                                
Out[48]: (2, 3)

Математические операции над этим чистым числовым массивом выполняются значительно быстрее, чем если бы это был массив dtype объекта, содержащий списки. Python уже имеет вложенные списки.

1
hpaulj 18 Дек 2019 в 22:47