Numpy объединенные списки, где первый столбец находится в диапазоне n - PullRequest
1 голос
/ 02 февраля 2020

Я пытаюсь выбрать все строки в матрице numpy с именем matrix с формой (25323, 9), где значения первого столбца находятся в диапазоне start и end для каждого кортежа на список range_tuple. В конечном итоге я хочу создать новую матрицу numpy, в результате чего final будет иметь форму (n, 9). Следующий код возвращает эту ошибку: TypeError: only integer scalar arrays can be converted to a scalar index. Я также попытался инициализировать final с numpy.zeros((1,9)) и использовал np.concatenate, но получил похожие результаты. Я получаю скомпилированный результат, когда использую final.append(result) вместо np.concatenate, но форма матрицы теряется. Я знаю, что есть правильное решение этой проблемы, любая помощь будет оценена.

  final = []
  for i in range_tuples:
    copy = np.copy(matrix)
    start = i[0]
    end = i[1]
    result = copy[(matrix[:,0] < end) & (matrix[:,0] > start)]
    final = np.concatenate(final, result)

  final = np.matrix(final)

Ответы [ 3 ]

1 голос
/ 02 февраля 2020

Я бы просто создал логическую маску для выбора строк, которые удовлетворяют требуемым условиям.

РЕДАКТИРОВАТЬ: я пропустил, что вы работаете с matrix (в отличие от ndarray). Ответ был отредактирован для matrix.

. Предположим следующие входные данные:

matrix = np.matrix([[1, 2, 3], [5, 6, 7], [2, 1, 7], [3, 4, 5], [8, 9, 0]])
range_tuple = [(0, 2), (1, 4), (1, 9), (5, 9), (0, 100)]

Затем, во-первых, я бы преобразовал range_tuple в numpy.ndarray:

range_mat = np.matrix(range_tuple)

Теперь создайте маску:

mask = np.ravel((matrix[:, 0] > range_mat[:, 0]) & (matrix[:, 0] < range_mat[:, 1]))

Примените маску:

final = matrix[mask]  # or matrix[mask].copy() if you intend to modify matrix

Для проверки:

print(final)
[[1 2 3]
 [2 1 7]
 [8 9 0]]

Если длина range_tuple может быть отличным от количества строк в matrix, затем выполните следующее:

n = min(range_mat.shape[0], matrix.shape[0])
mask = np.pad(
    np.ravel(
        (matrix[:n, 0] > range_mat[:n, 0]) & (matrix[:n, 0] < range_mat[:n, 1])
    ),
    (0, matrix.shape[0] - n)
)
final = matrix[mask]
1 голос
/ 02 февраля 2020
In [33]: arr                                                                                   
Out[33]: 
array([[ 0,  1,  2],
       [ 3,  4,  5],
       [ 6,  7,  8],
       [ 9, 10, 11],
       [12, 13, 14],
       [15, 16, 17],
       [18, 19, 20],
       [21, 22, 23]])
In [34]: tups = [(0,6),(3,12),(9,10),(15,14)]                                                  
In [35]: alist=[] 
    ...: for start, stop in tups: 
    ...:     res = arr[(arr[:,0]<stop)&(arr[:,0]>=start), :] 
    ...:     alist.append(res) 
    ...:                                                                                       

проверить список; обратите внимание, что элементы отличаются по форме; некоторые из них 1 или 0 строк. Рекомендуется проверить эти крайние случаи.

In [37]: alist                                                                                 
Out[37]: 
[array([[0, 1, 2],
        [3, 4, 5]]), array([[ 3,  4,  5],
        [ 6,  7,  8],
        [ 9, 10, 11]]), array([[ 9, 10, 11]]), array([], shape=(0, 3), dtype=int64)]

vstack объединяет их:

In [38]: np.vstack(alist)                                                                      
Out[38]: 
array([[ 0,  1,  2],
       [ 3,  4,  5],
       [ 3,  4,  5],
       [ 6,  7,  8],
       [ 9, 10, 11],
       [ 9, 10, 11]])

Здесь также работает concatenate, поскольку ось по умолчанию равна 0, и все входные данные уже 2д.

1 голос
/ 02 февраля 2020

Попробуйте следующее

final = np.empty((0,9))
for start, stop in range_tuples:
    result = matrix[(matrix[:,0] < end) & (matrix[:,0] > start)]
    final = np.concatenate((final, result))

Первый - инициализировать final как массив numpy. Первым аргументом для объединения должен быть список python массивов, см. docs . В вашем коде он интерпретирует переменную result как значение параметра axis

Примечания

  • Я использовал деконструкцию кортежа, чтобы сделать l oop яснее
  • копия не нужна
  • добавление списков может быть быстрее. Окончательный результат может быть впоследствии получен путем изменения формы , если result всегда имеет одинаковую длину.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...