Python 要分配给uint Numpy数组中缺少的值的值

Python 要分配给uint Numpy数组中缺少的值的值,python,python-3.x,numpy,missing-data,numpy-ndarray,Python,Python 3.x,Numpy,Missing Data,Numpy Ndarray,numpy数组z由两个Python列表x和y构成,其中y的值可以是0,x的值不会连续递增(即,可以跳过值) 由于y值也可以是0,因此将z中缺少的值也指定为0也会造成混淆 避免这种混淆的最佳做法是什么 import numpy as np # Construct `z` x = [1, 2, 3, 5, 8, 13] y = [12, 34, 56, 0, 78, 0] z = np.ndarray(max(x)+1).astype(np.uint32) # missing values be

numpy数组
z
由两个Python列表
x
y
构成,其中
y
的值可以是
0
x
的值不会连续递增(即,可以跳过值)

由于
y
值也可以是
0
,因此将
z
中缺少的值也指定为
0
也会造成混淆

避免这种混淆的最佳做法是什么

import numpy as np

# Construct `z`
x = [1, 2, 3, 5, 8, 13]
y = [12, 34, 56, 0, 78, 0]
z = np.ndarray(max(x)+1).astype(np.uint32)  # missing values become 0
for i in range(len(x)):
    z[x[i]] = y[i]

print(z)        # [ 0 12 34 56  0  0  0  0 78  0  0  0  0  0]
print(z[4])     # missing value but is assigned 0
print(z[13])    # non-missing value but also assigned 0
解决方案 您通常可以为
x
中不存在的索引分配
np.nan
或任何其他值

而且,不需要for循环。您可以在一行中直接分配
y
的所有值,如我在这里所示

但是,由于您正在向uint32进行类型转换,因此不能使用
np.nan
()。相反,您可以使用自己选择的大量数字(例如,
999999
),根据设计,这些数字不会显示在
y
中。有关更多详细信息,请参阅下面参考资料部分中共享的链接

将numpy导入为np
x=[1,2,3,5,8,13]
y=[12,34,56,0,78,0]
#无法将np.nan与uint32一起使用,因为np.nan被视为浮点
#选择一些较大的值:999999
z=np.ones(最大(x)+1)。A类型(np.uint32)*999999
z[x]=y
Z
#数组([999999,12,34,56,9999999,0,9999999,9999999,
#789999999999999999999999999990],数据类型=uint32)
工具书类

@athena wisdom有帮助吗?为什么
y.copy()
?与
np.nan
相乘后,如何保留原始
np.uint32
dtype
?看起来这些数字现在是np.float64@mathfux很好。那是个打字错误。删除了
.copy()
。谢谢你,雅典娜,现在试试看。您需要一个在
y
中无法找到的大值(如999999),并将其赋值,而不是
nan
,因为
np.nan
被视为
浮点值。您能接受带符号整数吗?您希望以后如何处理丢失的值?@davidhofman最好还是使用无符号整数,但了解使用有符号整数时的解决方案可能会有所帮助。当从阵列读取时检测到缺失值时,主程序中可能会使用不同的逻辑,例如引发错误或访问另一个索引处的值,直到找到非缺失元素