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调零是唯一的方式,谢谢。调零是唯一的方式,谢谢。