【问题标题】:Formatting Multi dimensional array with values [duplicate]用值格式化多维数组[重复]
【发布时间】:2023-03-07 12:45:01
【问题描述】:

如何编写代码,在 a 索引为负值或零值或 -100 或更小的值后立即将多维数组 a 中的每个单独数组的值更改为零对于b 索引。所以a 中的第二个数组没有负值,但b 在第四个索引处有一个-100,所以第四个索引之后的所有内容都将为零。 [45,50,60,30,23.2,232,-44,12,23] 30 以及紧随其后的值将变为零,从而导致输出:[45,50,60,0,0,0,0,0,0]。如果不是所有行都具有相同的长度,那么带有 dtype ="object" 的预期输出就会起作用。我怎样才能获得预期的输出?

import numpy as np 

a = np.array([[12,45,50,-600,30,23.2,232,-44,12],
             [45,50,60,30,23.2,232,-44,12,23],
             [50,60,30,23.2,232,-44,12,34,12],
             [60,30,23.2,232,-44,12,120,3,4],
             [-300,23.2,232,-44,12,23,23,2,12],
             [23.2,-232,-44,12,34,1,2,300.3,5]], dtype='object')

b= np.array([-12.4,-13.4,-44,-100,-6.3,-11,-10,-1.1,-0.3])

#Going through rows
for row,l in enumerate(a):
    #inside row iteration
    for counter,i in enumerate(l):
        if i<0 or b[counter]<=-100:
            l[l.index(i):] = [0] * len(l[l.index(i):])

输出:

AttributeError: 'numpy.ndarray' object has no attribute 'index'

预期输出:

[[12,45,50,0,0,0,0,0,0],
[45,50,60,0,0,0,0,0,0],
[50,60,30,0,0,0,0,0,0],
[60,30,23.2,0,0,0,0,0,0],
[0,0,0,0,0,0,0,0,0],
[23.2,0,0,0,0,0,0,0,0]]

【问题讨论】:

  • 这能回答你的问题吗? Formatting Multi dimensional arrays Python
  • 您的阵列与昨天的完全不同。哪个是真实案例?二维数组,还是列表数组?从列表中创建一个数组只会让生活变得复杂。

标签: python arrays numpy multidimensional-array indexing


【解决方案1】:

你应该试试:

for row,l in enumerate(a):
    #inside row iteration
    l = l.tolist()
    for counter,i in enumerate(l):
        if i<0 or b[counter]<=-100:
            a[row, l.index(i):] = [0] * len(l[l.index(i):])
print(a)

输出:

[[12 45 50 0 0 0 0 0 0]
 [45 50 60 0 0 0 0 0 0]
 [50 60 30 0 0 0 0 0 0]
 [60 30 23.2 0 0 0 0 0 0]
 [0 0 0 0 0 0 0 0 0]
 [23.2 0 0 0 0 0 0 0 0]]

它对你不起作用的原因是你需要在索引它之前将它转换为一个列表,你还必须将它分配回数组a

【讨论】:

  • 这是我的答案,你复制一下:stackoverflow.com/questions/68964513/…
  • @user1740577 我没有复制...我什至没有看到那个帖子...
  • @georgehere 这行得通吗?
  • 不用担心我没有用它作为论据。我只是想说这也是我的问题。是的,它有效
  • @U12-Forward 这不是一个有效的答案。使用 NumPy 时,您只需使用 np.wherenp.cumsum 即可解决此问题。使用 numpy 时最好避免使用 for 循环。 numpy 的重点是矢量化代码。
【解决方案2】:

在使用 Numpy 时,您应该避免使用任何显式的 for 循环,除非您必须这样做。向量化是一开始就使用 NumPy 的核心优势。您可以在不使用慢速 for 循环的情况下解决此问题 -

#Case 1
>>> n = -100
>>> np.where(np.cumsum(a<=c, axis=1) + np.cumsum(b<=c), 0, a)

array([[12, 45, 50, 0, 0, 0, 0, 0, 0],
       [45, 50, 60, 0, 0, 0, 0, 0, 0],
       [50, 60, 30, 0, 0, 0, 0, 0, 0],
       [60, 30, 23.2, 0, 0, 0, 0, 0, 0],
       [0, 0, 0, 0, 0, 0, 0, 0, 0],
       [23.2, 0, 0, 0, 0, 0, 0, 0, 0]], dtype=object)

根据您的条件,您首先需要创建一个布尔矩阵(或 0 和 1),基于您希望用 0 屏蔽的值。在这种情况下,您可以利用 np.cumsum 来传播 @在您的条件第一次出现 (axis=1。但由于您也使用b 进行检查,因此可以通过广播添加它们(相当于OR 操作)。

因此逻辑如下:

if: cumulative(condition1) OR cumulative(condition2), 
    return 0 
else: 
    return values from original array

【讨论】:

    【解决方案3】:

    您的代码只需稍作改动即可工作。不要尝试创建对象 dtype 数组。将其保留为列表列表。

    In [111]: alist = [[12,45,50,-600,30,23.2,232,-44,12],
         ...:              [45,50,60,30,23.2,232,-44,12,23],
         ...:              [50,60,30,23.2,232,-44,12,34,12],
         ...:              [60,30,23.2,232,-44,12,120,3,4],
         ...:              [-300,23.2,232,-44,12,23,23,2,12],
         ...:              [23.2,-232,-44,12,34,1,2,300.3,5]]
         ...: 
         ...: b= np.array([-12.4,-13.4,-44,-100,-6.3,-11,-10,-1.1,-0.3])
         ...: 
         ...: #Going through rows
         ...: for row,l in enumerate(alist):
         ...:     #inside row iteration
         ...:     for counter,i in enumerate(l):
         ...:         if i<0 or b[counter]<=-100:
         ...:             l[l.index(i):] = [0] * len(l[l.index(i):])
         ...: 
    In [112]: alist
    Out[112]: 
    [[12, 45, 50, 0, 0, 0, 0, 0, 0],
     [45, 50, 60, 0, 0, 0, 0, 0, 0],
     [50, 60, 30, 0, 0, 0, 0, 0, 0],
     [60, 30, 23.2, 0, 0, 0, 0, 0, 0],
     [0, 0, 0, 0, 0, 0, 0, 0, 0],
     [23.2, 0, 0, 0, 0, 0, 0, 0, 0]]
    

    昨天的样本也是如此:

    In [114]: alist = [[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]]
    In [115]: for row,l in enumerate(alist):
         ...:      ...:     #inside row iteration
         ...:      ...:     for counter,i in enumerate(l):
         ...:      ...:         if i<0 or b[counter]<=-100:
         ...:      ...:             l[l.index(i):] = [0] * len(l[l.index(i):])
         ...: 
    In [116]: alist
    Out[116]: 
    [[12, 45, 50, 0, 0],
     [12, 34, 5, 0, 0, 0, 0, 0],
     [3, 0, 0, 0, 0, 0, 0, 0],
     [12, 45, 3, 0, 0]]
    

    【讨论】:

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