У меня есть одномерный массив длины k с некоторыми произвольными значениями и трехмерный массив измерений k * i * j с некоторыми данными.
import numpy as np
# create 1D and 3D array
values = np.array([2, 5, 1], dtype=np.int)
arr = np.zeros((3, 4, 4), dtype=np.int)
# insert some random numbers in the 3D array
arr[0, 3, 2] = 5
arr[1, 1, 1] = 2
arr[2, 2, 3] = 1
>>> print(values)
[2 5 1]
>>> print(arr)
[[[0 0 0 0]
[0 0 0 0]
[0 0 0 0]
[0 0 5 0]]
[[0 0 0 0]
[0 2 0 0]
[0 0 0 0]
[0 0 0 0]]
[[0 0 0 0]
[0 0 0 0]
[0 0 0 1]
[0 0 0 0]]]
Моя цель состоит в том, чтобы определить, присутствует ли i th элемент values
( т.е. скаляр) в элемент i th из arr
( т.е. двумерный массив) и получение логического массива длиной k .
В моем примере , Я ожидаю получить массив [False, False, True]
, так как 1
является единственным числом, присутствующим в соответствующем 2D-массиве (arr[2]
).
Поскольку функция np.isin
не является опцией, я пришел пока что есть два возможных решения.
1) Создайте трехмерный массив, повторяя числа в values
, а затем проведите поэлементное сравнение:
rep = np.ones(arr.shape) * values.reshape(-1, 1, 1)
>>> print(rep)
[[[2. 2. 2. 2.]
[2. 2. 2. 2.]
[2. 2. 2. 2.]
[2. 2. 2. 2.]]
[[5. 5. 5. 5.]
[5. 5. 5. 5.]
[5. 5. 5. 5.]
[5. 5. 5. 5.]]
[[1. 1. 1. 1.]
[1. 1. 1. 1.]
[1. 1. 1. 1.]
[1. 1. 1. 1.]]]
>>> np.any((arr == rep), axis=(1, 2))
array([False, False, True])
Однако этот подход кажется плохой идеей с точки зрения памяти, если и values
, и arr
имеют большие фигуры.
2) Выполните итерацию по каждому значению в values
и проверьте, присутствует ли оно в соответствующем Нет 2D-массив arr
.
result = []
for i, value in enumerate(values):
result.append(value in arr[i])
>>> print(result)
[False, False, True]
Этот подход, конечно, лучше с точки зрения памяти, но, опять же, при реализации с большими массивами он может занять много времени (представьте, что k означает 1000000 вместо 3).
Есть ли какая-либо другая функция numpy
, которую мне не хватает, или, возможно, лучший подход к достижению sh моей цели здесь?
Я уже принял взгляните на ответы на аналогичный вопрос , но они не подходят для моего варианта использования.