【问题标题】:Removing zero values from a numpy array of arrays从数组的numpy数组中删除零值
【发布时间】:2020-06-14 14:02:58
【问题描述】:

原始数据

 [[ 0.00000000e+00  1.00000000e+00 -6.76207728e+00 -1.63236398e+01]
 [ 0.00000000e+00  1.00000000e+00  2.51283367e+01  1.13952157e+02]
 [ 0.00000000e+00  1.00000000e+00  3.11402956e+00 -5.16009612e+02]
 [ 0.00000000e+00  1.00000000e+00  3.10969787e+01  1.82175649e+02]
 [ 1.00000000e+00 -2.31269114e+00 -4.13720127e+02  3.55395844e+03]
 [ 1.00000000e+00  4.54598490e+01  6.19694322e+02  2.61091335e+03]
 [ 1.00000000e+00  7.36925014e-01 -4.49386738e+02 -1.22392549e+03]
 [ 1.00000000e+00  3.29511609e+00 -4.43413555e+02 -4.12677155e+03]]

我试图用下面的这个颂歌删除零

def removeZeroPadding(X):
  res = []
  for poly in enumerate(X):
      tmp = poly[1]
      tmp = tmp[tmp != 0]
      res.append(tmp)
  return res

这会变成

[array([  1.        ,  -6.76207728, -16.32363975]), array([  1.        ,  25.1283367 , 113.95215706]), array([   1.        ,    3.11402956, -516.0096117 ]), array([  1.        ,  31.09697873, 182.17564943]), array([ 1.00000000e+00, -2.31269114e+00, -4.13720127e+02,  3.55395844e+03]), array([1.00000000e+00, 4.54598490e+01, 6.19694322e+02, 2.61091335e+03]), array([ 1.00000000e+00,  7.36925014e-01, -4.49386738e+02, -1.22392549e+03]), array([ 1.00000000e+00,  3.29511609e+00, -4.43413555e+02, -4.12677155e+03])]

如何保持原始数据的结构没有零?谢谢

编辑:它应该看起来像这样

 [[ 1.00000000e+00 -6.76207728e+00 -1.63236398e+01]
 [ 1.00000000e+00  2.51283367e+01  1.13952157e+02]
 [ 1.00000000e+00  3.11402956e+00 -5.16009612e+02]
 [ 1.00000000e+00  3.10969787e+01  1.82175649e+02]
 [ 1.00000000e+00 -2.31269114e+00 -4.13720127e+02  3.55395844e+03]
 [ 1.00000000e+00  4.54598490e+01  6.19694322e+02  2.61091335e+03]
 [ 1.00000000e+00  7.36925014e-01 -4.49386738e+02 -1.22392549e+03]
 [ 1.00000000e+00  3.29511609e+00 -4.43413555e+02 -4.12677155e+03]]

【问题讨论】:

  • Numpy 提供了一种修剪方法
  • 你想要什么而不是零?
  • 试试这个,arr[arr != 0]
  • 是否要查找由全 0 组成的列并删除它们?
  • 使用“保留结构”,您的意思是要保留数组的初始尺寸(例如,在您的示例中为 4 x 6)?如果是这样,应该用什么值代替你的零?没有?

标签: python numpy


【解决方案1】:

您似乎不想将数组列表作为输出,而是想要一个二维数组(即[[...]] 而不是[array([...]), array([...])])。

但是,这是不可能的,因为在您通过删除零来修剪它们之后,数组的行最终会具有不同的大小(即,有些最终有 3 个元素,有些有 4 个)。如果您希望它是单个数组,就像数学中的矩阵一样,所有列(和所有行)都需要具有相同数量的元素。

作为替代方案,您可以为要修剪的元素分配不同的值,例如None,也可以create an empty array and fill it

【讨论】:

    【解决方案2】:

    你所寻求的基本上是不可能的。您不能同时从每行中删除可变数量的条目,同时保证每行具有相同数量的条目(这是获取[[...]] 类型的ndarray 所必需的。hlzl's answer 解释这个更详细。

    以下函数将从每一行的左侧和右侧删除0-entries,但它返回的将是[array([...]), array([...])]类型:

    def trim_zeros_in_rows(ndarr):
        return np.array([np.trim_zeros(row) for row in ndarr])
    
    print(trim_zeros_in_rows(np.array([[0., 0., 1., 0.],
                                       [2., 3., 4., 0.]])))
    

    打印:

    [array([1.]) array([2., 3., 4.])]
    

    【讨论】:

      【解决方案3】:
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-06-26
      • 1970-01-01
      • 2020-05-19
      • 2023-03-10
      • 2022-12-15
      相关资源
      最近更新 更多