给定一个numpy数组A
,例如:
[[ 0. 482. 1900. 961. 579. 56.]
[ 0. 530. 1906. 914. 584. 44.]
[ 43. 0. 1932. 948. 556. 51.]
[ 0. 482. 1917. 946. 581. 52.]
[ 0. 520. 1935. 878. 589. 55.]]
我想得到一个新数组,它排除出现0的所有列,即:
[[ 1900. 961. 579. 56.]
[ 1906. 914. 584. 44.]
[ 1932. 948. 556. 51.]
[ 1917. 946. 581. 52.]
[ 1935. 878. 589. 55.]]
我尝试的是以下内容:
non_zero = np.array([np.all(totals>0,axis=0)]*N_ROWS);
这给了我:
[[False False True True True True]
[False False True True True True]
[False False True True True True]
[False False True True True True]
[False False True True True True]]
麻烦的是,然后A[non_zero]
返回预期值,但重新排列为一维向量。
那么,你们知道我做错了什么,或者我是否过着复杂的生活?谢谢!
更新:感谢所有答案!除了接受的答案之外还有一个简短的事情:显然,除了选择本身,我应该使用:
操作数,如:
non_zero = np.array(np.all(totals!=0,axis=0));
a[:,non_zero]
当然,还有更紧凑的方式(见接受的答案)
答案 0 :(得分:5)
假设您的值是非负的:
A = np.array([[ 0, 482, 1900, 961, 579, 56.],
[ 0, 530, 1906, 914, 584, 44.],
[ 43, 0, 1932, 948, 556, 51.],
[ 0, 482, 1917, 946, 581, 52.],
[ 0, 520, 1935, 878, 589, 55.]])
A[:, np.all(A > 0, axis=0)]
哪个给了我
array([[ 1900., 961., 579., 56.],
[ 1906., 914., 584., 44.],
[ 1932., 948., 556., 51.],
[ 1917., 946., 581., 52.],
[ 1935., 878., 589., 55.]])
如果忽略潜在的精度问题,可以使用np.any(A == 0, axis=0)
答案 1 :(得分:3)
这样的事情怎么样?通过对每列中的零个数求和,找出哪些总和为零,可以找到正好为零0
s的列索引:
>>> B = A[:, np.sum(A == 0, axis=0) == 0 ]
>>> B
array([[ 1900., 961., 579., 56.],
[ 1906., 914., 584., 44.],
[ 1932., 948., 556., 51.],
[ 1917., 946., 581., 52.],
[ 1935., 878., 589., 55.]])
答案 2 :(得分:2)
您可以使用:
non_zero = (A != 0)
new = A[:, non_zero.all(axis = 0)]