В следующем примере:
>>> import numpy as np
>>> a = np.arange(10)
>>> b = a[:,np.newaxis]
>>> c = b.ravel()
>>> np.may_share_memory(a,c)
False
Почему numpy.ravel
возвращает копию моего массива? Разве он не должен просто возвращаться a
?
Изменить:
Я только что обнаружил, чтоnp.squeeze
не возвращает копию.
>>> b = a[:,np.newaxis]
>>> c = b.squeeze()
>>> np.may_share_memory(a,c)
True
Почему в этом случае есть разница между squeeze
и ravel
?
Изменить:
Как указал мгилсон, newaxis
помечает массив как несмежный, поэтому ravel
возвращает копию.
Итак, новый вопрос заключается в том, почему newaxis
помечает массив как несмежный.
История становится еще более странной:
>>> a = np.arange(10)
>>> b = np.expand_dims(a,axis=1)
>>> b.flags
C_CONTIGUOUS : True
F_CONTIGUOUS : False
OWNDATA : False
WRITEABLE : True
ALIGNED : True
UPDATEIFCOPY : False
>>> c = b.ravel()
>>> np.may_share_memory(a,c)
True
Согласно документации для expand_dims
, он должен быть эквивалентен newaxis
.