在python中用预定义值替换数组中的数字时出错

2024-10-04 15:25:45 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在尝试用一个基于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]]

Tags: or代码消息numberstringnprange数组
2条回答

更正:

arr1=[[19],[29],[ 0],[11],[ 1],[86],[90],[28],[23],[31],[39],[96],[82],[17],[71],[39],[ 8],[97]]

d是:

{9: 0, 19: 1, 29: 2, 39: 3, 49: 4, 59: 5, 69: 6, 79: 7, 89: 8, 99: 9}

完全回溯的错误是:

Traceback (most recent call last):
  File "stack53618793.py", line 8, in <module>
    arr2 = np.vectorize(d.get)(arr1)
  File "/usr/local/lib/python3.6/dist-packages/numpy/lib/function_base.py", line 1972, in __call__
    return self._vectorize_call(func=func, args=vargs)
  File "/usr/local/lib/python3.6/dist-packages/numpy/lib/function_base.py", line 2051, in _vectorize_call
    res = array(outputs, copy=False, subok=True, dtype=otypes[0])
TypeError: int() argument must be a string, a bytes-like object or a number, not 'NoneType'

n=8d表示{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=8get(19)返回None,因此返回的数据类型设置为object。你知道吗

使用n=9get(19)返回整数1(在d),因此返回的数据类型是int。当另一个get返回None时产生错误。你知道吗

一种修复方法是设置otypes。你知道吗

arr2 = np.vectorize(d.get, otypes=[object])(arr1)

另一种可能性是用get()替换get

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

那么就不需要None替换步骤了。你知道吗

这种矢量化的get可能不是进行这种替换的最快方法。但是,如果您确实使用vectorize,您需要注意像这样的自动otypes陷阱。你知道吗

当您询问错误时,您应该包含完整回溯,或者至少足够让我们确切地知道错误发生的位置。在我运行测试用例之前,这对我来说并不明显。

可以使用np.putmask(参见此处)用基于这些值的公式替换特定值(参见here)。你知道吗

至于你的情况,你可以modulus:这比使用字典更简单、更快。这代表你想要的输入/输出吗?你知道吗

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)

相关问题 更多 >

    热门问题