В первом случае a = np.array([c], dtype=np.object)
numpy ничего не знает о форме предполагаемого массива.
Например, когда вы определяете
d = range(10)
a = np.array([d])
Затем вы ожидаете, что numpy определитформа, основанная на длине d
.
Таким же образом, в вашем случае, numpy попытается определить, определен ли len(c)
и, если это так, получить доступ к элементам c
через * 1012.*.
Вы можете увидеть эффект, определив класс, такой как
class X(object):
def __len__(self): return 10
def __getitem__(self, i): return "x" * i
Тогда
print numpy.array([X()], dtype=object)
производит
[[ x xx xxx xxxx xxxxx xxxxxx xxxxxxx xxxxxxxx xxxxxxxxx]]
Для контраставо втором случае
a = np.empty((1,), dtype=np.object)
a[0] = c
Тогда форма a
уже определена.Таким образом, numpy может просто назначить объект напрямую.
Однако в некоторой степени это верно только в том случае, если a
является вектором.Если он был определен с другой формой, доступ к методу все равно будет происходить.Следующий пример, например, будет вызывать ___getitem__
для класса
a = numpy.empty((1, 10), dtype=object)
a[0] = X()
print a
, возвращает
[[ x xx xxx xxxx xxxxx xxxxxx xxxxxxx xxxxxxxx xxxxxxxxx]]