Как сравнить равенство представления в памяти числовых массивов (например, включая dtype) - PullRequest
2 голосов
/ 24 мая 2019

Как я могу сравнить, являются ли два numy массива точно идентичными в памяти, так что, например,

np.array([0,1]) == np.array([0,1])

имеет значение True, но

np.array([0,1]) == np.array([[0,1]])
np.array([0,1], dtype=np.int32) == np.array([0,1], dtype=np.int64)

обаЛожь.np.array_equal не имеет опции compare_dtypes.Я предполагаю, что могут быть и другие способы, чтобы представление массива в памяти тоже отличалось (например, endian-ness)

Ответы [ 3 ]

1 голос
/ 24 мая 2019

В зависимости от того, какие аспекты вы хотите охватить, минимум будет сравнивать x.dtype (включая порядковый номер) x.shape и x.strides.

Вы также можете посмотреть на некоторые флаги. Например, x.flags.aligned можно считать частью макета памяти в широком смысле, например x.flags.writeable (и, возможно, x.flags.owndata).

Флаги C/F_CONTIGUOUS, с другой стороны, становятся излишними, когда вы знаете форму и успехи, и, наконец, есть UPDATEIFCOPY и WRITEBACKIFCOPY, которые я недостаточно хорошо понимаю, чтобы комментировать.

1 голос
/ 24 мая 2019

Вы можете использовать itemsize, чтобы сравнить их по длине в байтах:

a1 = np.array([0,1], dtype=np.int32)
a2 = np.array([0,1], dtype=np.int64)
a1.itemsize == a2.itemsize
# False

Если вы хотите сравнить их размер и содержание, вы можетепроверить необработанное содержимое памяти данных с помощью ndarray.tobytes:

a1.tobytes() == a2.tobytes()
# False
0 голосов
/ 24 мая 2019

В настоящее время я использую pickle.dumps:

import pickle
a1 = np.array([0,1], dtype=np.int32)
a2 = np.array([0,1], dtype=np.int64)
pickle.dumps(a1) == pickle.dumps(a2)

Но это похоже на хак.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...