Питон говорит, что проще просить прощения, чем разрешения. Так что может быть меньше накладных расходов, если вы просто позвоните np.array
, а затем проверите для object
dtype.
Еще одна вещь, на которую нужно обратить внимание, это когда выдается ошибка. Например:
In [273]: np.array((np.zeros((2,3)), np.ones((2,4))))
---------------------------------------------------------------------------
ValueError Traceback (most recent call last)
<ipython-input-273-70f6273e3371> in <module>()
----> 1 np.array((np.zeros((2,3)), np.ones((2,4))))
ValueError: could not broadcast input array from shape (2,3) into shape (2)
Если неоднородность находится в первом измерении, она создает массив dtype объекта, например, np.array((np.zeros((2,3)), np.ones((1,4))))
. Но когда он находится на более глубоком уровне, кажется, что он выделяет массив результатов, а затем возникают проблемы при копировании в него одного или нескольких массивов компонентов. Это сложный случай для диагностики.
Или рассмотрим:
In [277]: np.array([[1,2,3],[4,5,'6']])
Out[277]:
array([['1', '2', '3'],
['4', '5', '6']], dtype='<U21')
Последний элемент во вложенном списке вызывает строку dtype. И если этот последний элемент является каким-то другим объектом PYthon, мы можем быть объектом dtype:
In [279]: np.array([[1,2,3],[4,5,{}]])
Out[279]:
array([[1, 2, 3],
[4, 5, {}]], dtype=object)
Но если объект является списком, мы получаем вариант с ошибкой трансляции:
In [280]: np.array([[1,2,3],[4,5,['6']]])
ValueError: setting an array element with a sequence
Но если вы хотите сначала проверить, np.stack
может быть хорошей моделью. При оси = 0 он ведет себя так же, как np.array
, если заданы массивы или списки.