使用随机放置的 NaN 创建示例 numpy 数组
Posted
技术标签:
【中文标题】使用随机放置的 NaN 创建示例 numpy 数组【英文标题】:Create sample numpy array with randomly placed NaNs 【发布时间】:2015-11-17 21:11:34 【问题描述】:出于测试目的,我想创建一个 M by N
numpy 数组,其中 c
随机放置 NaN
import numpy as np
M = 10;
N = 5;
c = 15;
A = np.random.randn(M,N)
A[mask] = np.nan
我在创建带有c
真实元素的mask
时遇到问题,或者这可以直接使用索引来完成?
【问题讨论】:
【参考方案1】:您可以将np.random.choice
与可选的replace=False
一起用于random selection without replacement
,并将它们用于A
的扁平版本(使用.ravel()
完成),就像这样-
A.ravel()[np.random.choice(A.size, c, replace=False)] = np.nan
示例运行 -
In [100]: A
Out[100]:
array([[-0.35365726, 0.26754527, -0.44985524, -1.29520237, 2.01505444],
[ 0.01319146, 0.65150356, -2.32054478, 0.40924753, 0.24761671],
[ 0.3014714 , -0.80688589, -2.61431163, 0.07787956, 1.23381951],
[-1.70725777, 0.07856845, -1.04354202, -0.68904925, 1.07161002],
[-1.08061614, 1.17728247, -1.5913516 , -1.87601976, 1.14655867],
[ 1.12542853, -0.26290025, -1.0371326 , 0.53019033, -1.20766258],
[ 1.00692277, 0.171661 , -0.89646634, 1.87619114, -1.04900026],
[ 0.22238353, -0.6523747 , -0.38951426, 0.78449948, -1.14698869],
[ 0.58023183, 1.99987331, -0.85938155, 1.4211672 , -0.43369898],
[-2.15682219, -0.6872121 , -1.28073816, -0.97523148, -2.27967001]])
In [101]: A.ravel()[np.random.choice(A.size, c, replace=False)] = np.nan
In [102]: A
Out[102]:
array([[ nan, 0.26754527, -0.44985524, nan, 2.01505444],
[ 0.01319146, 0.65150356, -2.32054478, nan, 0.24761671],
[ nan, -0.80688589, nan, nan, 1.23381951],
[ nan, nan, -1.04354202, -0.68904925, 1.07161002],
[-1.08061614, 1.17728247, -1.5913516 , nan, 1.14655867],
[ 1.12542853, nan, -1.0371326 , 0.53019033, -1.20766258],
[ nan, 0.171661 , -0.89646634, nan, nan],
[ 0.22238353, -0.6523747 , -0.38951426, 0.78449948, -1.14698869],
[ 0.58023183, 1.99987331, -0.85938155, nan, -0.43369898],
[-2.15682219, -0.6872121 , -1.28073816, -0.97523148, nan]])
【讨论】:
哦,这比我的方式优雅一点! 我想我也可以用np.random.randint(0,high=A.size,size=c)
替换我的应用程序的np.random.choice
(如果替换并不重要)。但是,为什么数组在ravel()
之后没有保持平坦?
@OlegKomarov np.random.randint
可能会给您重复索引,所以我认为这不适用于您的情况。关于.ravel()
的事情,它只是view
,所以它在内存中并没有完全变平。因此,“扁平视图”被索引并设置为 NaN,同时被保存为 2D 数组。
谢谢,我正在阅读文档 :)。作为最后的好奇,ravel()
的文档说A copy is made only if needed.
。我会得到一个扁平化的A
吗?
@OlegKomarov 如果您只是索引它,它必须保持为二维数组。您也可以使用np.put
获得相同的效果。所以,它的解决方案是np.put(A,np.random.choice(A.size, c, replace=False),np.nan)
。【参考方案2】:
您可以在新数组上使用np.random.shuffle
来创建您的掩码:
import numpy as np
M = 10;
N = 5;
c = 15;
A = np.random.randn(M,N)
mask=np.zeros(M*N,dtype=bool)
mask[:c] = True
np.random.shuffle(mask)
mask=mask.reshape(M,N)
A[mask] = np.nan
这给出了:
[[ 0.98244168 0.72121195 0.99291217 0.17035834 0.46987918]
[ 0.76919975 0.53102064 nan 0.78776918 nan]
[ 0.50931304 0.91826809 0.52717345 nan nan]
[ 0.35445471 0.28048106 0.91922292 0.76091783 0.43256409]
[ 0.69981284 0.0620876 0.92502572 nan nan]
[ nan nan nan 0.24466688 0.70259211]
[ 0.4916004 nan nan 0.94945378 0.73983538]
[ 0.89057404 0.4542628 nan 0.95547377 nan]
[ 0.4071912 0.36066797 0.73169132 0.48217226 0.62607888]
[ 0.30341337 nan 0.75608859 0.31497997 nan]]
【讨论】:
你的也不错!我不得不谷歌搜索随机选择而不替换,发现random_choice
有那个可选的replace
参数,刚刚工作! :)以上是关于使用随机放置的 NaN 创建示例 numpy 数组的主要内容,如果未能解决你的问题,请参考以下文章
如何在不使用 Pandas 的情况下创建等效于 numpy.nan 的日期时间对象?
从 pandas 转换为 numpy 后,如果数组包含 nan,则删除“nan”或减少 numpy 数组的长度 [重复]