python - 用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]]
解决方案
您可以使用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)
推荐阅读
- powershell - OpenVPN命令行安装
- javascript - Firebase nodemailer - 快照数据问题
- php - 应该忽略少数数字的差异
- android - 从结果 google.com 打开应用程序,始终指向 WebView Android 的主页
- npm - 有没有办法检查安装了哪些版本的库?
- azure-data-factory - 如何列出和删除 Azure Data Lake Store Gen1 上的空文件夹
- reactjs - 页面更改触发事件
- c++ - 通过方法访问结构
- arangodb - Arango 搜索视图中不支持 LIKE 运算符
- c# - 关闭 c# 应用程序后删除 DLL