我正在尝试用一个基于n值的新集合替换数组(0-99重复)中的值。例如,ifn=0
,值0,10,20..90应替换为0,1,2..9,其余应为10。以下代码适用于除9以外的所有n(0-8)值。对于9,它给出了一个消息long() argument must be a string or a number, not 'NoneType'
我已经试过很多次调试这个,但似乎找不到问题所在。你知道吗
import numpy as np
arr1=[[19][29][ 0][11][ 1][86][90][28][23][31][39][96][82][17][71][39][ 8][97]]
n = 9
d = {}
for i, j in zip(range(n, 100, 10), range(10)):
d[i] = j
arr2 = np.vectorize(d.get)(arr1)
arr2[arr2 == None] = 10
arr1
是原始数组,arr2
是新数组。你知道吗
输出应为
arr2=[[ 1] [ 2] [10] [10] [10] [10] [10] [10] [10] [10] [ 3] [10] [10] [10] [10] [ 3] [10] [10]]
更正:
d
是:完全回溯的错误是:
用
n=8
d
表示{8: 0, 18: 1, 28: 2, 38: 3, 48: 4, 58: 5, 68: 6, 78: 7, 88: 8, 98: 9}
。arr2
有很多None
,因为这是get
的默认值。你知道吗vectorize
使用第一个元素arr1
执行测试计算,并使用结果设置返回值dtype
。你知道吗使用
n=8
,get(19)
返回None
,因此返回的数据类型设置为object
。你知道吗使用
n=9
,get(19)
返回整数1
(在d
),因此返回的数据类型是int
。当另一个get
返回None
时产生错误。你知道吗一种修复方法是设置
otypes
。你知道吗另一种可能性是用get()替换
get
那么就不需要
None
替换步骤了。你知道吗这种矢量化的
get
可能不是进行这种替换的最快方法。但是,如果您确实使用vectorize
,您需要注意像这样的自动otypes
陷阱。你知道吗当您询问错误时,您应该包含完整回溯,或者至少足够让我们确切地知道错误发生的位置。在我运行测试用例之前,这对我来说并不明显。
可以使用
np.putmask
(参见此处)用基于这些值的公式替换特定值(参见here)。你知道吗至于你的情况,你可以modulus:这比使用字典更简单、更快。这代表你想要的输入/输出吗?你知道吗
为所需输出编辑:
如果要使用字典,请在
.get
方法中设置默认值相关问题 更多 >
编程相关推荐