Строковое сравнение в NumPy - PullRequest
0 голосов
/ 07 мая 2018

Скажем, у нас есть два массива:

arr = np.array([
    [
        [1, 2, 3],
        [4, 5, 6],
        [7, -8, 9],
        [10, 11, 12]
    ],
    [
        [13, 14, -15],
        [16, -17, 18],
        [19, 20, 21],
        [22, 23, 24]
    ]
])

и

comp = np.array([
    [2, 20, 4],
    [3, 8, 15]
])

Я пытаюсь сравнить каждый одномерный массив comp с двумерным массивом arr (по строкам), т.е.

[2, 20, 4] > [1, 2, 3] = [1 1 1]

если следующая строка не удовлетворяет условию, аннулируйте comp, а затем сравните его:

[-2, 20, -4], [4, 5, 6] = [-1 1 -1]

если больше ничего не удовлетворяет, поставьте 0

А для второго образца из arr он должен сравниваться со вторым 1D из comp, т.е.:

[2, 20, 4], [13, 14, -15] = [...]

Значит, должно быть что-то вроде

[
  [
    [1 1 1]
    [-1 1 -1]
    ...
 ]
 [
   [...]
   [...]
 ]
]

Я пытался сделать что-то вроде этого:

for sample in arr:
    for row in sample:
        print(np.where(np.greater(row, comp), 1, np.where(np.less(row, -comp), -1, 0)))

Но этот код сравнивает полный массив comp с arr[0][#] и a[1][#] (альтернативно).

Как мне сделать этот ряд мудрым?

Обновление:

Это правильный способ сделать это?:

for idx, sample in enumerate(arr):
    print(np.where(np.greater(sample, comp[idx]), 1, np.where(np.less(sample, -comp[idx]), -1, 0)))

1 Ответ

0 голосов
/ 07 мая 2018

Обычный способ сделать сравнение (с -1, 0, 1) - использовать np.sign:

In [11]: np.sign(comp[0] - arr[0])
Out[11]:
array([[ 1,  1,  1],
       [-1,  1, -1],
       [-1,  1, -1],
       [-1,  1, -1]])

Итак, это можно записать как:

In [12]: np.array([np.sign(comp[i] - a) for i, a in enumerate(arr)])
Out[12]:
array([[[ 1,  1,  1],
        [-1,  1, -1],
        [-1,  1, -1],
        [-1,  1, -1]],

       [[-1, -1,  1],
        [-1,  1, -1],
        [-1, -1, -1],
        [-1, -1, -1]]])

Там может быть аккуратный способ сделать «вычитание» в чистом виде ... например, используя np.repeat / tile, чтобы получить comp того же размера, что и arr (или что-то умное)!

Обновление: спасибо @ flippo за чистое решение: n 1016 *

In [13]: np.sign(comp[:,np.newaxis,:] - arr)
Out[13]:
array([[[ 1,  1,  1],
        [-1,  1, -1],
        [-1,  1, -1],
        [-1,  1, -1]],

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