Python TypeError: в скалярный индекс могут быть преобразованы только целочисленные скалярные массивы - PullRequest
0 голосов
/ 24 ноября 2018

Я сделал для этого вопроса более простой пример двух массивов: labelArray - это 1D-массив, в котором метки имеют индексы, соответствующие тем же индексам в nD-массиве someValuesArray.Я получаю все индексы, где встречается метка 2, и хочу получить значения в someValuesArray.

labelArray = [2,0,1,2]

someValuesArray= [array([[ 2.15072 ,  2.12438 ,  2.27047 , 2.64567 , 
2.22976 ,  2.18186 ]], dtype=float32), 
    array([ [ 2.29442,  2.3087 ,  2.3111 , 2.1962 ,  2.23694, 2.16988]], dtype=float32)),
    array([[2.82851 , 2.73032 , 2.78301 , 1.71722 , 1.81542 , 1.78189 ]], dtype=float32)),
    array([[ 1.19271,  1.14721,  1.27894 , 1.16637,  1.23343, 1.21666]], dtype=float32)]

Так что, если я хочу метку 2, я получу индексы 0 и 3, которые должны дать мне значенияиндексы 0 и 3 в соответствующем массиве someValuesArray.

Но я получаю TypeError @ array[indices], когда хочу вызвать свою функцию.

TypeError: only integer scalar arrays can be converted to a scalar index

Моя функция:

def searchValues(array, value):
    labelArray = [2,0,1,2]
    values_of_array = np.array(labelArray)
    indices = np.where(values_of_array == value)[0]
    return array[indices]

searchValues(someValuesArray,2)

Ответы [ 2 ]

0 голосов
/ 24 ноября 2018

Как упоминалось в комментариях, someValuesArray - это список из 2d numpy массивов.Я преобразовал это в np.array.Пример кода в вашем вопросе пытается проиндексировать список python с помощью массива numpy, что приводит к получению сообщения об ошибке.

In [111]: a=np.array(someValuesArray) # Convert to a numpy array

In [112]: a
Out[112]:
array([[[ 2.15071988,  2.12438011,  2.2704699 ,  2.64566994,  2.22975993,      2.18185997]],
[[ 2.29442   ,  2.30870008,  2.31110001,  2.19619989,  2.23693991,  2.16987991]],
[[ 2.82851005,  2.73031998,  2.78301001,  1.71721995,  1.81542003,  1.78189003]],
[[ 1.19271004,  1.14721   ,  1.27893996,  1.16637003,  1.23343003,  1.21666002]]], dtype=float32)

In [113]: def searchValues(array, value):
              labelArray = [2,0,1,2]
              values_of_array = np.array(labelArray)
              indices = np.where(values_of_array == value)[0]
              # print statements added to see what's happening
              print("Indices: ", indices)
              print("Array selection: \n", array[indices])
              return array

          searchValues(a,2)
[Out]
Indices:  [0 3]
Array selection:
[[[ 2.15071988  2.12438011  2.2704699   2.64566994  2.22975993  2.18185997]] # a[0]
[[ 1.19271004  1.14721     1.27893996  1.16637003  1.23343003  1.21666002]]] # a[3]

Out[113]:
array(
[[[ 2.15071988,  2.12438011,  2.2704699 ,  2.64566994,  2.22975993,  2.18185997]],
 [[ 2.29442   ,  2.30870008,  2.31110001,  2.19619989,  2.23693991,  2.16987991]],
 [[ 2.82851005,  2.73031998,  2.78301001,  1.71721995,  1.81542003,  1.78189003]],
 [[ 1.19271004,  1.14721   ,  1.27893996,  1.16637003,  1.23343003,  1.21666002]]],      dtype=float32)

Оба индекса, возвращаемые indices = np.where(values_of_array == value)[0], используются для указания на строки в массиве.

Вы вернули весь массив из функции: вы действительно хотели вернуть array[indices]?

0 голосов
/ 24 ноября 2018

Я могу воспроизвести ваше сообщение об ошибке с помощью:

Индекс списка со скалярным массивом:

In [7]: [1,2,3,4][np.array(1)]
Out[7]: 2

Индекс списка с массивом (1,);один элемент, но не скалярный массив:

In [8]: [1,2,3,4][np.array([1])]
---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-8-4ad73b219fa3> in <module>()
----> 1 [1,2,3,4][np.array([1])]

TypeError: only integer scalar arrays can be converted to a scalar index

Но можно индексировать массив следующим образом:

In [9]: np.array([1,2,3,4])[np.array([1])]
Out[9]: array([2])
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...