2016-11-15 2 views
2

У меня есть Numpy массив 2D, и я хочу, чтобы выполнить следующую операцию:Изменение некоторых Numpy столбцов массива в соответствии с логическим условием

Для каждого столбца в массиве, который представляет собой ряд неубывания значений, замените этот столбец с столбцом различий (т. е. каждая запись представляет собой разницу между двумя предыдущими).

Каждый столбец остается тем же (за исключением того, что первая строка удаляется, чтобы соответствовать размерности столбцов различий).

Например, в матрице:

[ [1,1,1,2,3,4] 
    [1,3,4,3,4,5] 
    [1,7,3,4,2,7] ] 

Матрица разностей:

[ [0,2,3,1,1,1] 
    [0,4,-1,1,-1,2] ] 

И, таким образом, третий и пятый столбцы, которые имеют уменьшающиеся значения останутся прежними, в то время как другие столбцы заменены столбцами разницы, в результате чего:

[ [0,2,4,1,4,1] 
    [0,4,3,1,2,2] ] 

Я попробовал несколько вещи, как это:

tempX = np.diff(X, axis = 0).transpose() 
return np.where(tempX >= 0, tempX, X[1:].transpose()) 

Но условие в np.where выполняется поэлементно, а не для каждого столбца (или строки). Как я могу изменить условие, чтобы оно работало?

Есть ли более эффективный способ реализации этого?

+0

Не могли бы вы использовать большой массив в качестве образца и больше разнообразия в цифрах? – Divakar

+0

Трудно понять, есть ли опечатка в вашем примере. ;) Полагаю, это должно быть «будет изменено на' [[0, 2, 1] [0, 4, 3]] '", правильно? – nostradamus

+0

Я изменил пример, надеюсь, что теперь это яснее? – keren42

ответ

0

Вы можете использовать boolean-indexing -

# Get the differentiation along first axis 
diffs = np.diff(a,axis=0) 

# Mask of invalid ones 
mask = (diffs<0).any(0) 

# Use the mask to set the invalid ones to the original elements 
diffs[:,mask] = a[1:,mask] 

Пример запуска -

In [141]: a 
Out[141]: 
array([[1, 1, 1, 2, 3, 4], 
     [1, 3, 4, 3, 4, 5], 
     [1, 7, 3, 4, 2, 7]]) 

In [142]: diffs = np.diff(a,axis=0) 
    ...: mask = (diffs<0).any(0) 
    ...: diffs[:,mask] = a[1:,mask] 
    ...: 

In [143]: diffs 
Out[143]: 
array([[0, 2, 4, 1, 4, 1], 
     [0, 4, 3, 1, 2, 2]]) 
1

Вы можете попробовать так:

b = a[1:] - a[:-1] 
decrease = numpy.where(numpy.min(b, axis=0)<0) 
b[:,decrease] = a[1:, decrease] 

Вы также можете сделать это в одном выражении:

numpy.where(numpy.min(a[1:]-a[:-1],axis=0)>=0, a[1:]-a[:-1], a[1:]) 
Смежные вопросы