Индексирование массива numpy с использованием другого массива numpy [duplicate]

Я читал где-то еще, что вы можете попробовать - поймать java.lang.OutOfMemoryError и в блоке catch вы можете освободить все ресурсы, которые, как вы знаете, могут использовать много памяти, тесные соединения и т. д., затем выполните System.gc () затем повторите попытку, что бы вы не сделали.

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

Идея состоит в том, чтобы сделать сбор мусора, вызвав System.gc (), который, как известно, увеличивает свободную память. Вы можете продолжать проверять это после выполнения кода gobbling памяти.

//Mimimum acceptable free memory you think your app needs
long minRunningMemory = (1024*1024);

Runtime runtime = Runtime.getRuntime();

if(runtime.freeMemory()<minRunningMemory)
 System.gc();
10
задан voo 17 June 2016 в 10:15
поделиться

2 ответа

Вы можете использовать NumPy's advanced indexing -

A[np.arange(A.shape[0])[:,None],B]

Можно также использовать linear indexing -

m,n = A.shape
out = np.take(A,B + n*np.arange(m)[:,None])

Прогон прогона -

In [40]: A
Out[40]: 
array([[2, 4, 5, 3],
       [1, 6, 8, 9],
       [8, 7, 0, 2]])

In [41]: B
Out[41]: 
array([[0, 0, 1, 2],
       [0, 3, 2, 1],
       [3, 2, 1, 0]])

In [42]: A[np.arange(A.shape[0])[:,None],B]
Out[42]: 
array([[2, 2, 4, 5],
       [1, 9, 8, 6],
       [2, 0, 7, 8]])

In [43]: m,n = A.shape

In [44]: np.take(A,B + n*np.arange(m)[:,None])
Out[44]: 
array([[2, 2, 4, 5],
       [1, 9, 8, 6],
       [2, 0, 7, 8]])
14
ответ дан Divakar 17 August 2018 в 16:46
поделиться
  • 1
    Спасибо, очень полезно. – voo 17 June 2016 в 10:42
  • 2
    Я не понимаю, как это работает ... вы могли бы добавить некоторые объяснения? – Jason S 31 October 2017 в 22:38
  • 3
    @JasonS В основном используется массив диапазонов вдоль первой оси, чтобы выбрать один по каждой оси для каждого элемента в B. Предоставленная ссылка должна содержать все необходимые сведения. – Divakar 31 October 2017 в 22:41
  • 4
    Хм ... ну, это нормально, но я смотрю на передовую ссылку индексации, и это не имеет смысла для меня. Мне нужно расширить ваш пример до N-мерного массива, где применяется только последний индекс, и я не уверен, как это сделать. – Jason S 31 October 2017 в 22:44

Ниже приведено решение с использованием цикла for:

outlist = []
for i in range(len(B)):
    lst = []    
    for j in range(len(B[i])):
        lst.append(A[i][B[i][j]])
    outlist.append(lst)
outarray = np.asarray(outlist)
print(outarray)

Выше также может быть написано в форме более сжатого списка:

outlist = [ [A[i][B[i][j]] for j in range(len(B[i]))]
                for i in range(len(B))  ]
outarray = np.asarray(outlist)
print(outarray)

Выход:

[[2 2 4 5]
 [1 9 8 6]
 [2 0 7 8]]
0
ответ дан rnso 17 August 2018 в 16:46
поделиться
Другие вопросы по тегам:

Похожие вопросы: