Изменение значения некоторых индексов массива в python - PullRequest
0 голосов
/ 03 марта 2019

Я пытаюсь этот простой код для поиска в массиве и замены элементов, которые больше, чем от 1 до 1:

import numpy as np

j = np.array([[1],[3],[1],[0],[9]])

for x in j:
    if abs(x) > 1 :
        j[x] = 1

Но я получаю такие ошибки:

IndexError: индекс 9 выходит за пределы оси 0 с размером 5

Ответы [ 6 ]

0 голосов
/ 03 марта 2019

Вы можете заменить оператор for следующим:

for x in range(len(j))
0 голосов
/ 03 марта 2019

Вы пытаетесь создать двумерный массив?Ваши элементы заключены в квадратные скобки "[[1], [3], [1], [0], [9]]" .... также вы перебираете значения, а не индексы: x - этозначение массива "[3]", а не индекс "1".

Изменить на:

import numpy as np

j = np.array([1,3,1,0,9])

# Keep track of index starting at 0
i = 0
for x in j:
    if abs(x) > 1 :
        # change value at index i
        j[i] = 1
    # increment index
    i += 1
0 голосов
/ 03 марта 2019

Если все, что вы делаете, это делает все значения, если absolute(j[i]) больше 1 к 1, тогда numpy имеет встроенную возможность, и это настолько просто, что это можно сделать в одну строку и более эффективно, чем любой цикл python:

j[np.absolute(j) > 1] = 1

Чтобы показать вам, как это будет работать:

#made 3 a negitive value to prove absolute works.
j = np.array([[1],[-3],[1],[0],[9]])

j[np.absolute(j) > 1] = 1

j теперь:

[[1]
 [1]
 [1]
 [0]
 [1]]
0 голосов
/ 03 марта 2019

как вы видите в выводе ошибки

IndexError: индекс 9 выходит за пределы для оси 0 размером 5

вы пытаетесь обновить значение виндекс 9, но ваш массив имеет размер 5. Это означает, что вы используете не индекс массива, а значение индекса.

перечислите массив и выполните цикл с индексом и значением

for i,x in  enumerate(j):
    if abs(x) > 1 :
        j[i] = 1
0 голосов
/ 03 марта 2019

Попробуйте изменить цикл for с помощью enumerate на:

import numpy as np

j = np.array([[1],[3],[1],[0],[9]])

for i,x in enumerate(j):
    if abs(x) > 1 :
        j[i] = 1
0 голосов
/ 03 марта 2019

Когда вы проходите массив в цикле for, вы фактически получаете доступ к элементам, а не к индексу.В конце концов, вы сравниваете x с 1.Вы можете получить индекс разными способами, одним из распространенных является использование enumerate, например так:

import numpy as np

j = np.array([[1],[3],[1],[0],[9]])

for i,x in enumerate(j):    # i is the index, x is the value
    if abs(x) > 1 :
        j[i] = 1
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...