In [1]: a = [np.array([0.0, 0.2, 0.4, 0.6, 0.8]),
...: np.array([0.0, 0.2, 0.4, 0.6, 0.8]),
...: np.array([0.0, 0.2, 0.4, 0.6, 0.8])]
In [2]:
In [2]: a
Out[2]:
[array([0. , 0.2, 0.4, 0.6, 0.8]),
array([0. , 0.2, 0.4, 0.6, 0.8]),
array([0. , 0.2, 0.4, 0.6, 0.8])]
a
- список массивов.b
- это двумерный массив.
In [3]: b = np.array(a)
In [4]: b
Out[4]:
array([[0. , 0.2, 0.4, 0.6, 0.8],
[0. , 0.2, 0.4, 0.6, 0.8],
[0. , 0.2, 0.4, 0.6, 0.8]])
In [5]: b[0] += 1
In [6]: b
Out[6]:
array([[1. , 1.2, 1.4, 1.6, 1.8],
[0. , 0.2, 0.4, 0.6, 0.8],
[0. , 0.2, 0.4, 0.6, 0.8]])
b
получает значения из a
, но не содержит ни одного из объектов a
.Базовая структура данных этого b
очень отличается от a
, списка.Если это неясно, вы можете рассмотреть основы numpy
(которые говорят о форме, шагах и буферах данных).
Во втором случае b
- это массив объектов, содержащийте же объекты, что и a
:
In [8]: b = np.array(a)
In [9]: b
Out[9]:
array([array([0. , 0.2, 0.4, 0.6, 0.8]), array([0. , 0.2, 0.4, 0.6, 0.8]),
array([0. , 0.2, 0.4, 0.6])], dtype=object)
Этот b
ведет себя так же, как a
- оба содержат массивы.
Конструкция этого массива объектов сильно отличается от2-й числовой массив.Я думаю о числовом массиве как о стандартном, или обычном, недобросовестном поведении, в то время как массив объектов - это «уступка», дающая нам полезный инструмент, но не имеющий вычислительных мощностей многомерного массива.
Создать объектный массив легко по ошибке - некоторые говорят, что это слишком просто.Это может быть сложнее сделать надежно по замыслу.Для примера с оригинальным a
нам нужно сделать:
In [17]: b = np.empty(3, object)
In [18]: b[:] = a[:]
In [19]: b
Out[19]:
array([array([0. , 0.2, 0.4, 0.6, 0.8]), array([0. , 0.2, 0.4, 0.6, 0.8]),
array([0. , 0.2, 0.4, 0.6, 0.8])], dtype=object)
или даже for i in range(3): b[i] = a[i]