I';m使用掩码对numpy数组进行切片,但输出是平坦的。如何保留列数?
以下是我到目前为止的情况:I';m使用掩码对numpy数组进行切片,但输出是平坦的。如何保留列数?,numpy,mask,Numpy,Mask,以下是我到目前为止的情况: arr = np.round(np.random.uniform(0,1,size = (10,10)),decimals = 0) print(arr) arr2 = np.cumsum(arr,axis=0) print(arr2) mask = np.where((arr == 1)&(arr2<=3),1,0) print(mask) population = np.round(np.random.uniform(0,5,size=(10,10)
arr = np.round(np.random.uniform(0,1,size = (10,10)),decimals = 0)
print(arr)
arr2 = np.cumsum(arr,axis=0)
print(arr2)
mask = np.where((arr == 1)&(arr2<=3),1,0)
print(mask)
population = np.round(np.random.uniform(0,5,size=(10,10)),decimals=0)
print(population)
maskedPop = population[mask==1]
print(maskedPop)
arr=np.round(np.random.uniform(0,1,size=(10,10)),小数=0)
打印(arr)
arr2=np.cumsum(arr,轴=0)
打印(arr2)
mask=np。其中((arr==1)和(arr2看起来maks在每列中产生相同数量的非零行。因此,您可能可以屏蔽(直接使用布尔数组)和重塑
:
population[(arr == 1)&(arr2<=3)].reshape(3,-1)
array([[3., 2., 5., 0., 4., 2., 0., 4., 5., 1.],
[4., 3., 5., 3., 4., 1., 1., 4., 5., 4.],
[3., 3., 4., 3., 4., 2., 4., 4., 1., 5.]])
population[(arr==1)和(arr2看起来maks每列生成的非零行数相同。因此,您可能可以屏蔽(直接使用布尔数组)和重塑:
population[(arr == 1)&(arr2<=3)].reshape(3,-1)
array([[3., 2., 5., 0., 4., 2., 0., 4., 5., 1.],
[4., 3., 5., 3., 4., 1., 1., 4., 5., 4.],
[3., 3., 4., 3., 4., 2., 4., 4., 1., 5.]])
population[(arr==1)和(arr2您的代码,缩小规模:
In [153]: arr = np.round(np.random.uniform(0,1,size = (5,5)),decimals = 0)
...: print(arr)
...: arr2 = np.cumsum(arr,axis=0)
...: print(arr2)
...: mask = np.where((arr == 1)&(arr2<=3),1,0)
...: print(mask)
...: population = np.round(np.random.uniform(0,5,size=(5,5)),decimals=0)
...: print(population)
...: print(mask==1)
...: maskedPop = population[mask==1]
...: print(maskedPop)
计算每行或每列的True
数。告诉我们如何保留某种2d结果
===
我看到您已经显示了mask
,因此mask==
与
In [158]: mask.astype(bool)
Out[158]:
array([[False, True, True, False, True],
[ True, False, True, True, True],
[ True, False, False, True, True],
[ True, True, False, False, False],
[False, False, False, False, False]])
有一个MaskedArray
类,允许您使用具有特定值的数组“屏蔽”:
In [161]: np.ma.masked_array(population, mask!=1)
Out[161]:
masked_array(
data=[[--, 5.0, 2.0, --, 2.0],
[1.0, --, 2.0, 4.0, 0.0],
[2.0, --, --, 2.0, 2.0],
[4.0, 4.0, --, --, --],
[--, --, --, --, --]],
mask=[[ True, False, False, True, False],
[False, True, False, False, False],
[False, True, True, False, False],
[False, False, True, True, True],
[ True, True, True, True, True]],
fill_value=1e+20)
===
在数组中保留屏蔽值的另一种方法是以某种方式“归零”值:
In [162]: mpop = population.copy()
In [163]: mpop[mask!=1] = np.nan
In [164]: mpop
Out[164]:
array([[nan, 5., 2., nan, 2.],
[ 1., nan, 2., 4., 0.],
[ 2., nan, nan, 2., 2.],
[ 4., 4., nan, nan, nan],
[nan, nan, nan, nan, nan]])
您的代码,缩小规模:
In [153]: arr = np.round(np.random.uniform(0,1,size = (5,5)),decimals = 0)
...: print(arr)
...: arr2 = np.cumsum(arr,axis=0)
...: print(arr2)
...: mask = np.where((arr == 1)&(arr2<=3),1,0)
...: print(mask)
...: population = np.round(np.random.uniform(0,5,size=(5,5)),decimals=0)
...: print(population)
...: print(mask==1)
...: maskedPop = population[mask==1]
...: print(maskedPop)
计算每行或每列的True
数。告诉我们如何保留某种2d结果
===
我看到您已经显示了mask
,因此mask==
与
In [158]: mask.astype(bool)
Out[158]:
array([[False, True, True, False, True],
[ True, False, True, True, True],
[ True, False, False, True, True],
[ True, True, False, False, False],
[False, False, False, False, False]])
有一个MaskedArray
类,允许您使用具有特定值的数组“屏蔽”:
In [161]: np.ma.masked_array(population, mask!=1)
Out[161]:
masked_array(
data=[[--, 5.0, 2.0, --, 2.0],
[1.0, --, 2.0, 4.0, 0.0],
[2.0, --, --, 2.0, 2.0],
[4.0, 4.0, --, --, --],
[--, --, --, --, --]],
mask=[[ True, False, False, True, False],
[False, True, False, False, False],
[False, True, True, False, False],
[False, False, True, True, True],
[ True, True, True, True, True]],
fill_value=1e+20)
===
在数组中保留屏蔽值的另一种方法是以某种方式“归零”值:
In [162]: mpop = population.copy()
In [163]: mpop[mask!=1] = np.nan
In [164]: mpop
Out[164]:
array([[nan, 5., 2., nan, 2.],
[ 1., nan, 2., 4., 0.],
[ 2., nan, nan, 2., 2.],
[ 4., 4., nan, nan, nan],
[nan, nan, nan, nan, nan]])
之后,您可以使用maskedPop手动重塑它。重塑(10,3)
。为了礼貌起见,当您使用print
显示代码时,您应该显示结果。如果您阅读numpy
文档,您将了解到使用布尔掩码进行索引会产生1d结果。因为这样的掩码可以在每行中选择不同数量的元素,所以(通常)不能保留一个2d结果。你从哪里得到(3,10)形状?@hpaulj面具的工作方式是,每列中应该至少有3个True。从统计上讲,这不太可能发生。特别是当我包含更多行时。这有什么区别?在我的测试用例(5,5)中列的“真”数不同。如果在掩码中有一些特殊的结构,您必须将其构建到代码中,并且不要假设普通numpy代码会为您找到它(也不要期望我们检测到它)。您可以在之后使用maskedPop手动重新塑造它。重新塑造(10,3)
。为了礼貌起见,当您使用print
显示代码时,您应该显示结果。如果您阅读numpy
文档,您将了解到使用布尔掩码进行索引会产生1d结果。因为这样的掩码可以在每行中选择不同数量的元素,所以(通常)不能保留一个2d结果。你从哪里得到(3,10)形状?@hpaulj面具的工作方式是,每列中应该至少有3个True。从统计上讲,这不太可能发生。特别是当我包含更多行时。这有什么区别?在我的测试用例(5,5)中列的“真”数不同。如果您的掩码中有一些特殊结构,您必须将其构建到代码中,并且不要假设普通numpy代码会为您找到它(也不要期望我们检测到它)。但它没有将结果保留在正确的列中…我如何将屏蔽结果保留在原始总体数组的同一列中?我不确定你的意思。你能添加预期输出吗?@lara_toffIts没有将结果保留在正确的列中…我如何将屏蔽结果保留在原始数组的同一列中l人口数组?我不知道你的意思。你能添加预期的输出吗?@lara_Tofff调零是唯一的方式,谢谢。调零是唯一的方式,谢谢。