Вопрос по python, numpy – Как я могу проверить, что два среза массивов NumPy одинаковы (или перекрываются)?

7

Я хотел бы проверить, являются ли два ndarrays перекрывающимися представлениями одного и того же основного ndarray.

Чтобы проверить, что два среза одинаковы, я могу сделать что-то вроде:

a.base is b.base and a.shape == b.shape and a.data == b.data

Казалось, что сравнение буферов работает в одном простом случае - кто-нибудь может сказать мне, работает ли он вообще?

К сожалению, это не будет работать для перекрывающихся срезов, и я не выяснил, как извлечь из буфера точно, каково его смещение в базовых данных - возможно, кто-то может помочь мне с этим?

Также скажемa а такжеb кусочкиx, а такжеc кусочекb, Поскольку базовые данные одинаковы, я также хотел бы обнаружить совпадения междуc а такжеa, Казалось бы, у меня получится уйти, сравнив только буфер и форму ... если кто-нибудь скажет мне, как именно, я был бы благодарен.

Ваш Ответ

2   ответа
9

numpy.may_share_memory() это лучшая эвристика, которая у нас есть на данный момент. Это консервативно эвристический; это может дать вам ложные срабатывания, но не даст вам ложных отрицаний. Я думаю, что могут быть способы улучшить эвристику, чтобы быть на 100% правильными. Если они выпадут, они будут включены в эту функцию, так что это лучший путь вперед.

x[0::2] / x[1::2]. x[:, 0:5], x[:, 5:10]. x = np.dstack(*args); np.may_share_memory(x[0], x[1]).
Error: User Rate Limit Exceeded shaunc
1

Можно было бы сравнить, где индексы живут в памяти, используяctypes свойство массивов. Это может занять некоторую работу, поэтому вы можете сделать шаг назад и посмотреть, есть ли другой способ решения вашей проблемы.

Похожие вопросы