我需要以下问题的帮助,PLZ。
Suppose X = [1 3 0 8
1 4 6 0
2 0 7 8 ]
mask = (X != 0)
mask = [ T T F T
T T T F
T F T T]
X1 = X[(mask,np.newaxis)]
其输出X1的形状为(9,1)
但我希望X1为(3,3),即除了蒙版条目外,保持与X相同的形状。
X1 = [1 3 8
1 4 6
2 7 8 ]
有人可以帮助我吗?谢谢。
X的每一行都包含零,我不想使用reshape()。这是工作
X= np.array([[1,3,0,8],[1,4,6,0],[2,0,7,8]])
mask = (X!=0)
X1=X[(mask,np.newaxis)]
输出X的形状为(9,1)。 X1是否有任何方式(3,3)如上所述。
答案 0 :(得分:1)
我认为您可能希望在python中更容易开始,因为您的问题甚至不包含正确的语法。我希望这只是一个伪代码尝试。但是,这里有一些代码来做你想要的面具。
import numpy as np
X = np.array([1, 3, 0, 8, 1, 4, 6, 0, 2, 0, 7, 8])
indicies_we_want = np.where(X > 0) # Results in an array containing the indicies of X we want to keep
result = np.take(X, indicies_we_want) # Filter by these indicies
result = result.reshape(3, 3) # Reshape to desired result
print result
此代码可以大大简化,但为了清晰起见,我想在您的问题中显示每个步骤。
正如评论部分所指出的,重塑通常不是一个好主意,除非你在过滤掉0之后以某种方式知道你将留下9个元素。在你描述的情况下,我们当然知道这一点,但是对于给定的数组,不是那么多。
答案 1 :(得分:1)
In [173]: x=[[1,3,0,8],[1,4,6,0],[2,0,7,8]]
In [174]: xa=np.array(x)
重塑形式的解决方案:
In [175]: xa[xa!=0].reshape(3,3)
Out[175]:
array([[1, 3, 8],
[1, 4, 6],
[2, 7, 8]])
没有重塑的解决方案:
In [176]: np.array([i[i!=0] for i in xa])
Out[176]:
array([[1, 3, 8],
[1, 4, 6],
[2, 7, 8]])
显然两者都取决于每行只有一个删除。
您没有删除公共列;您的代码中没有任何内容告诉底层的numpy结果将是可重新调整的。因此,布尔索引在平顶数组上运行。
In [177]: xa[xa!=0]
Out[177]: array([1, 3, 8, 1, 4, 6, 2, 7, 8])
In [178]: xa.flat[xa.flat!=0]
Out[178]: array([1, 3, 8, 1, 4, 6, 2, 7, 8])
我可以多加一个0,这个索引仍然可以正常工作;但将其重塑为3x3的努力将失败。
请记住,基础数据缓冲区是平面的,1d,并且由于shape
和striding
属性,它只显示为2d。选择元素(或跳过一些元素)将产生一个副本,1d副本与2d副本一样简单,甚至更快。 reshape
不会更改数据缓冲区,只会更改shape
属性。