【问题标题】:Formatting Multi dimensional arrays Python格式化多维数组 Python
【发布时间】:2021-10-28 01:10:24
【问题描述】:

如何编写代码,在出现负值后立即将多维数组a 中的每个单独数组的值更改为零。所以a 中的第二个数组的负值[12,34,5,6,88,-10,30,75] 为-10,这会将其所有值以及紧随其后的值变为零。将数组转换为[12,34,5,6,88,0,0,0]。我怎样才能获得预期的输出?

import numpy as np 

a = np.array([[12,45,50,60,30],
             [12,34,5,6,88,-10,30,75],
             [3,45,332,45,-12,-4,-64,12],
             [12,45,3,22,323]])

预期输出:

[[12,45,50,60,30],
 [12,34,5,6,88,0,0,0],
 [3,45,332,45,0,0,0,0],
 [12,45,3,22,323]]

【问题讨论】:

  • 您应该始终展示自己的努力来解决您的问题。 Stack Overflow 不应该是一个“为我写代码”的网站。

标签: python arrays numpy indexing format


【解决方案1】:

试试这个:

import numpy as np 

a = np.array([[12,45,50,60,30],
             [12,34,5,6,88,-10,30,75],
             [3,45,332,45,-12,-4,-64,12],
             [12,45,3,22,323]], dtype='object')


for l in a:
    for i in l:
        if i<0:
            l[l.index(i):] = [0] * len(l[l.index(i):])
            
a

输出:

array([list([12, 45, 50, 60, 30]), list([12, 34, 5, 6, 88, 0, 0, 0]),
       list([3, 45, 332, 45, 0, 0, 0, 0]), list([12, 45, 3, 22, 323])],
      dtype=object)

第二种解决方案:

import numpy as np 

def neg_to_zero(l):
    for i in l:
        if i<0:
            l[l.index(i):] = [0] * len(l[l.index(i):])

a = np.array([[12,45,50,60,30],
             [12,34,5,6,88,-10,30,75],
             [3,45,332,45,-12,-4,-64,12],
             [12,45,3,22,323]], dtype='object')

list(map(neg_to_zero, a))

a

【讨论】:

    【解决方案2】:

    你的数组:

    In [608]: a = np.array([[12,45,50,60,30],
         ...:              [12,34,5,6,88,-10,30,75],
         ...:              [3,45,332,45,-12,-4,-64,12],
         ...:              [12,45,3,22,323]])
    <ipython-input-608-894f7005e102>:1: VisibleDeprecationWarning: Creating an ndarray from ragged nested sequences (which is a list-or-tuple of lists-or-tuples-or ndarrays with different lengths or shapes) is deprecated. If you meant to do this, you must specify 'dtype=object' when creating the ndarray.
      a = np.array([[12,45,50,60,30],
    In [609]: a
    Out[609]: 
    array([list([12, 45, 50, 60, 30]), list([12, 34, 5, 6, 88, -10, 30, 75]),
           list([3, 45, 332, 45, -12, -4, -64, 12]),
           list([12, 45, 3, 22, 323])], dtype=object)
    

    这包含长度不同的列表。它不是多维的。将其设为数组,而不是将其保留为列表的列表,并不会使其更易于处理。

    无论哪种方式,您都必须迭代,并分别更改每个列表。

    【讨论】:

      【解决方案3】:

      首先,关注answer by hpaulj。如果您的数据不合适,请不要使用 numpy。您的数据不适合 numpy,因为您有一个列表列表,其中每个包含的列表都有一个 不同 长度。如果都具有 相同的 长度(矩阵形状),它将适合 numpy。

      到问题本身:将其简化为解决单个列表上的任务,然后转换每个列表。

      data = [
          [12, 45, 50, 60, 30],
          [12, 34, 5, 6, 88, -10, 30, 75],
          [3, 45, 332, 45, -12, -4, -64, 12],
          [12, 45, 3, 22, 323]
      ]
      for row in data:
          transform(row)
      

      算法:我们会遍历列表,当找到负数元素时,我们知道当前位置,然后我们可以设置所有后续元素。

      我将向您展示两种变体。

      第一个变体使用切片。它还使用enumerate(),它为您提供(index, value) 用于列表(或其他可迭代)的元组。

      def transform(lst):
          for (index, value) in enumerate(lst):
              if value < 0:
                  lst[index:] = [0] * (len(lst) - index)
      

      它通过将[0](1 元素列表)乘以余数的长度来创建一个用零填充的新列表。然后它将它分配给正在转换的列表的一部分。此切片分配会更改列表本身。

      第二个变体使用一点“状态”:

      def transform(lst):
          do_overwrite = False
          for (index, value) in enumerate(lst):
              if value < 0:
                  do_overwrite = True # "flips a switch", stay on
              if do_overwrite:
                  lst[index] = 0
      

      Python 列表是对象,就像 Python 中的几乎所有其他东西一样。这意味着,当您调用函数并将列表作为参数传递时,不会复制列表,但函数调用会获取该列表对象以使用。对该对象的任何更改...对调用者来说都是“可见的”,因为它是被处理的同一个列表对象。

      【讨论】:

        猜你喜欢
        • 2021-12-02
        • 2021-05-13
        • 1970-01-01
        • 2014-09-05
        • 2021-05-17
        • 2021-11-06
        • 2021-11-02
        • 2021-05-02
        • 1970-01-01
        相关资源
        最近更新 更多