Пользовательский NumPy Slice - PullRequest
       10

Пользовательский NumPy Slice

0 голосов
/ 02 января 2019

У меня есть несколько массивов, которые могут отличаться по форме:

[[1, 1, 1, 1, 1],
 [1, 1, 1, 1, 1],
 [1, 1, 1, 1, 1],
 [1, 1, 1, 1, 1]]

Мне нужно выбрать и сохранить индексы в переменной, чтобы я мог изменить массив на:

[[1, 1, 1, 1, 1],
 [1, 1, 1, 1, 0],
 [1, 1, 1, 1, 0],
 [0, 0, 0, 0, 0]]

Я могу взять вертикальные индексы:

idx = np.s_[1:4, 3]

Но я не могу понять, как добавить все индексы из последней строки и сохранить их в idx

Обновление

Я хочу индексы. Есть моменты, когда мне нужно ссылаться на значения в этих индексах, и бывают случаи, когда я хочу изменить значения в этих индексах. Наличие индексов позволит мне гибко делать оба.

Ответы [ 2 ]

0 голосов
/ 02 января 2019

Мне не известен встроенный метод NumPy, но, возможно, это подойдет:

import numpy as np

a = np.random.rand(16).reshape((4, 4))   # Test matrix (4x4)
inds_a = np.arange(16).reshape((4, 4))   # Indices of a
idx = np.s_[0:3, 3]     # Vertical indices
idy = np.s_[3, 0:3]     # Horizontal indices

# Construct slice matrix
bools = np.zeros_like(a, dtype=bool)
bools[idx] = True
bools[idy] = True

print(a[bools])         # Select slice from matrix
print(inds_a[bools])    # Indices of sliced elements
0 голосов
/ 02 января 2019

Это не совсем то использование срезов, как у вас, но numpy позволяет индексировать списки, чтобы вы могли хранить все координаты, которые вы хотите изменить.

A = np.ones((4,5))

col = np.zeros(7,dtype='int')
row = np.zeros(7,dtype='int')

col[:5] = np.arange(5)
col[5:] = 4

row[:5] = 3
row[5:] = np.arange(1,3)

A[row,col] = 0

Вы также можете использовать два среза idx1 = np.s_[1:4,3] и idx2 = np.s_[3,0:5] и примените их обоих.

...