当前位置: 首页 > 知识库问答 >
问题:

保留第一个非零元素,将所有其他元素设置为0

诸葛彦
2023-03-14

我有一个2-d NumPy阵列,看起来像这样:

array([[0. , 0. , 0.2, 0.2],
       [0.3, 0. , 0.3, 0. ]])

我想修改它,使每一行都由所有0组成,除了第一个非零条目。如果一开始都是0,我们不会改变任何东西。

我可以这样做:

example = np.array([[0,0, 0.2, 0.2], [0.3, 0, 0.3, 0]])
my_copy = np.zeros_like(example)
for i, row in enumerate(example):
    for j, elem in enumerate(row):
        if elem > 0:
            my_copy[i, j] = elem
            break

但这很难看,而且没有矢量化。对如何将其矢量化有什么建议吗?

谢谢

共有3个答案

骆文华
2023-03-14

设置

x = np.array([[0. , 0. , 0.2, 0.2],
          [0.3, 0. , 0.3, 0. ],
          [0. , 0. , 0. , 0. ]])

使用logical_andnp.eye

m = (x!=0).argmax(1)
x[~np.logical_and(x, np.eye(x.shape[1])[m])] = 0

输出:

array([[0. , 0. , 0.2, 0. ],
       [0.3, 0. , 0. , 0. ],
       [0. , 0. , 0. , 0. ]])

使用这种方法会比其他两种建议的方法稍慢。

殷德本
2023-03-14

简单的

e =np.zeros(example.shape)
rows = np.arange(example.shape[0])
cols =  np.argmax(example != 0, 1)
e[rows, cols] = example[rows, cols]
仇承志
2023-03-14

这是一个矢量化的解决方案。诀窍是通过bool转换和argmax计算第一个非零条目。

import numpy as np

A = np.array([[0. , 0. , 0.2, 0.2],
              [0.3, 0. , 0.3, 0. ],
              [0. , 0. , 0. , 0. ]])

res = np.zeros(A.shape)
idx =  np.arange(res.shape[0])
args = A.astype(bool).argmax(1)
res[idx, args] = A[idx, args]

print(res)

array([[ 0. ,  0. ,  0.2,  0. ],
       [ 0.3,  0. ,  0. ,  0. ],
       [ 0. ,  0. ,  0. ,  0. ]])
 类似资料:
  • 问题内容: 我对如何在Java中执行此操作有一般的想法,但是我正在学习Python,但不确定如何执行。 我需要实现一个函数,该函数返回一个包含列表中所有其他元素的列表,从第一个元素开始。 到目前为止,我不确定从这里开始该怎么做,因为我只是在学习Python中的for循环是如何不同的: 问题答案:

  • 问题内容: 我有一个非常大的.xml文件,我正在尝试制作一个新的.xml文件,该文件只包含了该较大文件内容的一小部分。我想指定一个属性(在我的情况下为itemID),并为其指定一些特定的值,然后它将除去所有具有那些itemID及其子元素的元素。 我的大型.xml文件如下所示: 该文件大约有9万行,大约9兆字节。 注意如何有itemID,某些项目类型可以(但不总是)在其中包含更多项目,并且这些子项也

  • 问题内容: 我觉得我花了很多时间用Python编写代码,但没有足够的时间来创建Pythonic代码。最近,我遇到了一个有趣的小问题,我认为这可能是一个简单而惯用的解决方案。简而言之,我需要收集列表中的每个顺序对。例如,给定列表,我想计算。 当时我想出了一个快速的解决方案,看起来像翻译过的Java。再问这个问题,我能做的最好的就是 在长度不均的情况下,这会产生丢掉最后一个数字的副作用。 我是否缺少一

  • 我是冬眠新手,不会RTFM,所以我希望有人能帮我节省很多时间。 我的数据库中的对象之间有多对多的关系。假设员工和工作。 我想选择分配给给定员工的所有作业。我的对象乔布斯有一个正在处理它的所有员工的列表。所以,在java中,它应该是:作业job.employees.contains(员工)。除了我需要把它变成一个Hibernate查询什么的。 现在,我在选择所有东西后,正在Java中使用蛮力。 如何

  • 问题内容: 我想做的是将某个对象悬停时,它会影响另一个对象的属性。 例如,在这个JSFiddle演示中,当您将鼠标悬停在其上时,它会发生变化,但是我想要的是,当我将鼠标悬停在上时,它会受到影响。 问题答案: 如果多维数据集直接位于容器内部: 如果多维数据集位于容器旁边(在容器关闭标签之后): 如果多维数据集在容器内的某个位置: 如果多维数据集是容器的同级:

  • 本文向大家介绍使用CSS为其父元素的第一个子元素的每个 元素设置样式,包括了使用CSS为其父元素的第一个子元素的每个 元素设置样式的使用技巧和注意事项,需要的朋友参考一下 要设置作为其父级第一个子级的每个<p>元素的样式,请使用CSS:first-child选择器。 示例 您可以尝试运行以下代码来实现:first-child选择器-