Если у вас достаточно памяти для хранения логической маски формы вашего исходного массива, а также нового массива, вот один из способов сделать это:
import numpy as np
def main():
np.random.seed(1) # For reproducibility
data = generate_data((10, 6))
indices = rightmost_min_col(data)
new_data = pop_col(data, indices)
print 'Original data...'
print data
print 'Modified data...'
print new_data
def generate_data(shape):
return np.random.randint(0, 10, shape)
def rightmost_min_col(data):
nrows, ncols = data.shape[:2]
min_indices = np.fliplr(data).argmin(axis=1)
min_indices = (ncols - 1) - min_indices
return min_indices
def pop_col(data, col_indices):
nrows, ncols = data.shape[:2]
col_indices = col_indices[:, np.newaxis]
row_indices = np.arange(ncols)[np.newaxis, :]
mask = col_indices != row_indices
return data[mask].reshape((nrows, ncols-1))
if __name__ == '__main__':
main()
Это дает:
Original data...
[[5 8 9 5 0 0]
[1 7 6 9 2 4]
[5 2 4 2 4 7]
[7 9 1 7 0 6]
[9 9 7 6 9 1]
[0 1 8 8 3 9]
[8 7 3 6 5 1]
[9 3 4 8 1 4]
[0 3 9 2 0 4]
[9 2 7 7 9 8]]
Modified data...
[[5 8 9 5 0]
[7 6 9 2 4]
[5 2 4 4 7]
[7 9 1 7 6]
[9 9 7 6 9]
[1 8 8 3 9]
[8 7 3 6 5]
[9 3 4 8 4]
[0 3 9 2 4]
[9 7 7 9 8]]
Один из менее читаемых приемов, которые я здесь использую, - это использование вещания numpy во время сравнения массивов.В качестве быстрого примера рассмотрим следующее:
import numpy as np
a = np.array([[1, 2, 3]])
b = np.array([[1],[2],[3]])
print a == b
Это дает:
array([[ True, False, False],
[False, True, False],
[False, False, True]], dtype=bool)
Итак, если мы знаем индекс столбца элемента, который мы хотим удалить, мы можем векторизовать операциюдля массива индексов столбцов, что делает pop_col
.