首页 > 解决方案 > 用python中的预定义值替换数组中的数字时出错

问题描述

我正在尝试用基于 n 值的新集合替换数组中的值(0-99 重复)。例如。如果n=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]]

标签: pythonnumpy

解决方案


您可以使用np.putmask(参见此处)将特定值替换为基于这些值的公式(参见此处)。

至于你的情况,你可以取模:它比使用字典更容易和更快。这是否代表您想要的输入/输出?

import numpy as np
n = 9

arr1=np.random.randint(0, 100, size=20)
arr2 = arr1.copy()
np.putmask(arr2, (arr1-n)%10 == 0, arr1 % 10)

print(arr1)
print(arr2)

[69 70 63 52 27 96 0 40 2 90 36 24 17 90 67 58 74 50 11 58]

[ 9 70 63 52 27 96 0 40 2 90 36 24 17 90 67 58 74 50 11 58]

为您想要的输出编辑:

n = 9 
arr1=np.random.randint(0, 100, size=20)
arr2 = arr1.copy()
mask = (arr1-n)%10 == 0
np.putmask(arr2, mask , arr1 // 10)
np.putmask(arr2, ~mask , 10)
print(arr1)
print(arr2)

[28 72 87 31 87 3 34 96 61 14 25 79 74 25 38 87 38 8 6 8] [10 10 10 10 10 10 10 10 10 10 10 7 10 10 10 10 10 10 10 10]

如果要使用字典,请在.get方法中设置默认值

arr2 = np.vectorize(lambda x: d.get(x,10))(arr1)

推荐阅读