我正在尝试这个简单的代码来搜索数组并替换大于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的范围
如果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]]
当您在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
尝试使用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
正如您在错误输出中看到的那样
IndexError:索引9超出轴0的大小为5的范围
您正在尝试更新索引9处的值,但您的数组大小为5.这显然意味着您没有使用数组索引,而实际上是索引处的值。
枚举您的数组并运行包含索引和值的循环
for i,x in enumerate(j):
if abs(x) > 1 :
j[i] = 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
您可能希望用以下内容替换for语句:
for x in range(len(j))