在python中更改数组的某些索引的值

问题描述 投票:1回答:6

我正在尝试这个简单的代码来搜索数组并替换大于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的范围

python arrays numpy
6个回答
4
投票

如果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]]

1
投票

当您在for循环中遍历数组时,实际上是访问元素,而不是索引。毕竟,你正在比较x1。您可以通过多种方式检索索引,其中一个常见的方法是使用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

1
投票

尝试使用enumerate更改for循环:

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

1
投票

正如您在错误输出中看到的那样

IndexError:索引9超出轴0的大小为5的范围

您正在尝试更新索引9处的值,但您的数组大小为5.这显然意味着您没有使用数组索引,而实际上是索引处的值。

枚举您的数组并运行包含索引和值的循环

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

1
投票

你想做一个二维数组吗?你在括号“[[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
投票

您可能希望用以下内容替换for语句:

for x in range(len(j))
© www.soinside.com 2019 - 2024. All rights reserved.