Как выполнить операцию на каждые два столбца массива NumPy? - PullRequest
1 голос
/ 26 февраля 2012

Сейчас у меня есть массив NumPy 0 и 1, и я хочу выполнить logical_and для каждого двух столбцов.Цикл for, обеспечивающий это, выглядел бы следующим образом:

import numpy as np
result = []
data = [[0, 1, 1],
        [1, 0, 1],
        [1, 0, 1]]
np_data = np.array(data)
num_cols = len(np_data[1,:])
for i in range(0, num_cols):
    for j in range(i+1, num_cols):
        #Comparing every column with every other column
        anded = np.logical_and(np_data[:,i], np_data[:,j])
        result.append(anded)
print result

Мне просто было интересно, существует ли способ, * NumPy -заказанный, поскольку, очевидно, циклы for не подходят для работыNumPy массивы.

Ответы [ 3 ]

1 голос
/ 26 февраля 2012

Вы можете сделать это следующим образом, обратите внимание, что результатом является транспонирование вашего результата (также в этом случае результатом является 2d-массив, а в вашем случае это список 1-мерных массивов).

>>> from itertools import combinations
>>> I, J = np.array(list(combinations([0,1,2], 2))).T
>>> result = np.logical_and(np_data[:, I], np_data[:, J])
>>> result
array([[False, False,  True],
       [False,  True, False],
       [False,  True, False]], dtype=bool)
>>> result.T
array([[False, False, False],
       [False,  True,  True],
       [ True, False, False]], dtype=bool)
0 голосов
/ 26 февраля 2012

Предположим, у вас есть массив (n, m) с n строками и m столбцами, тогда вы можете получить логический и между всеми возможными столбцами как массив (m, m), где каждый элемент является массивом размера n.Это похоже на ваш результат, но в два раза больше (без треугольной матрицы).

import numpy as np
data = np.array([[0, 1, 1],
                 [1, 0, 1],
                 [1, 0, 1]])
n,m = data.shape
dist0 = np.tile(data.T,(m,1)).reshape(m,m,n) # repeat columns along axis 0
dist1 = np.tile(data.T,(1,m)).reshape(m,m,n) # repeat columns along axis 1
result = np.logical_and(dist0, dist1)
# now result[i,j] contains the logical_and bewteen column i and j
print(result[0,2])
[False  True  True]
0 голосов
/ 26 февраля 2012

Я уверен, что есть более разумный способ построения списков индексов ii, jj, но это то же самое, что и ваш код для вашего примера:

import numpy as np
data = [[0, 1, 1],
       [1, 0, 1],
       [1, 0, 1]]
np_data = np.array(data)
q=range(len(data))
ii,jj=zip(*[[i,j] for i in q for j in q if i<j])
result=np.transpose(np.logical_and(np_data[:,list(ii)],np_data[:,list(jj)]))

Edit: для ii,jj вы также можете использоватьэто (вдохновленный Баго):

ii,jj = np.array(list(combinations(q, 2))).T
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...