【问题标题】:Remove items from array从数组中删除项目
【发布时间】:2014-09-21 20:46:42
【问题描述】:

我有一个类似于 [0 0 0],[3 3 3],[255 255 255] 的数组(数字是 RGB 值),我想删除所有具有 [0 0 0] 值的项目] 并作为结果-> [3 3 3],[5 5 5]。为了实现我的不同算法,首先我必须使我的数组成为一个列表(使用 .tolist 方法),它会返回一个像这样的列表:“[0, 0, 0]”,“[3,3,3 ]","[255, 255, 255]". 那么第一个问题:[0 0 0] 和 "[0, 0, 0]" 有什么区别吗?

此外,我还使用了许多主题中提出的不同算法,例如:

for n,i in enumerate(mylist)
    if 0 in i: mylist[n].remove(0)

def clear_list_from_item(mylist, item):
    try:
       while True: mylist.remove(item)
    except ValueError:
       return mylist

mylist = [clear_list_from_item(x, 0) for x in mylist]

而且它们都没有返回结果。所以我的第二个问题:为什么?是因为我的列表,因为当我应用它时,让我们说在列表中像 =[[3,4],[5],[6,7,8]] 所有这些都很好用.

更新:1)嵌套级别:269x562(即我正在使用的图片的高度x宽度,因此我得到每个像素的列表) 2)我在.tolist()方法之前的数组第一行的18个值的初始数组

[[  0   0   0]
[255 255 255]
[255 255 255]
[255 255 255]
[255 255 255]
[250 250 250]
[255 255 255]
[255 255 255]
[255 255 255]
[255 255 255]
[  0   0   0]
[  0   0   0]
[  0   0   0]
[  0   0   0]
[  0   0   0]
[  0   0   0]
[  0   0   0]
[  0   0   0]

【问题讨论】:

  • 你的数组是什么`A numpy.array?
  • 看起来你的数组不是你想象的那样。它可能包含字符串而不是整数。 print repr(your_array) 并向我们展示结果。
  • 数组([[[ 0, 0, 0], [ 0, 0, 0], [ 0, 0, 0]], [[ 2, 2, 2], [255, 255 , 255], [244, 244, 244], ..., [[ 0, 0, 0], [ 0, 0, 0], [ 0, 0, 0], ..., [ 0, 0, 0], [ 0, 0, 0], [ 0, 0, 0]]], dtype=uint8)

标签: python list


【解决方案1】:
mylist = filter(lambda rgb: any(rgb), mylist)

编辑

它可以更好:

mylist = filter(any, mylist)

【讨论】:

  • 这样做:filter(lambda a: a != 0, mylist) but no result
  • 请注意,[x for x in mylist if any(x)] 是相似的,有时是首选。
  • @Miko a != 0any(a) 不同。 a != 0 没有意义,因为 a 是一个列表。 any(a) 判断任何元素 in a(RGB 值)是否为 0
  • 我实现为:my_new_list=[x for x in my_old_list if any(0)] 并得到以下错误:TypeError: 'int' object is not iterable
  • @DimKoim 很抱歉我脾气暴躁,但这太烦人了。您在答案和 cmets 中至少有 4 个正确的解决方案,但您仍然试图纠正它们并实际上使它们不正确,而没有很好地理解您在做什么。您没有完成足够的教程来自己解决它 - 耻辱。您已经为您的问题找到了现成的答案,更改它们(例如使用 any),显然没有检查文档中的 any 做了什么 - 哦,来吧,只是表现出一些努力。
【解决方案2】:

假设您有以下来源列表:

>>> my_nested_list = [[0, 0, 0], [3, 3 ,3], [255, 255, 555]]

有几种方法可以删除包含所有零的条目。一个不错的方法是使用列表推导式,它会创建一个仅包含您想要的值的新列表:

>>> my_new_list = [sublist for sublist in my_nested_list if sublist != [0, 0, 0]]
>>> my_new_list
[[3, 3 ,3], [255, 255, 555]]

请注意,使用此方法您不会改变(修改初始列表),如果您稍后必须对其进行更多处理,这可能会很方便,但此方法的缺点是您最终会占用更多内存(因为您'正在创建一个新列表)。

如果你真的想修改你的源列表,有几种方法可以做到,其中之一包括使用del

def delete_stuff_in_my_list(m_list, pattern=[0, 0, 0]):
    for index, value in enumerate(m_list):
        if value == pattern:
            del m_list[index]

在这种情况下:

>>> delete_stuff_in_my_list(my_nested_list)
>>> my_nested_list
[[3, 3, 3], [255, 255, 255]]

顺便说一句,关于可用的不同删除选项here 有很好的解释

【讨论】:

  • 在这两种情况下打印 min(my_nested_list)--->[[0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0],.... 我不知道为什么以及如何解决它。
  • 这很奇怪。您能否在原始帖子中添加原始列表(或至少其完整结构、嵌套级别)?
  • 我是新手,如何“找到”嵌套级别?此外,附加两个 .csv 文件,一个带有我的初始数组,一个带有 .tolist() 的返回是否更有帮助?
  • 嵌套我的意思是有多少“列表中的列表”。是的,请发布您正在使用的初始列表(或者如果太大,则发布可用的切片)?
【解决方案3】:

你应该修改你的第一个函数:

mylist = [[0, 0, 0],[3, 3, 3],[255, 255, 255]]
for n,i in enumerate(mylist):
    if i == [0,0,0]:
         mylist.pop(n) # pop remove object at position n in-place
         # or with : mylist.remove(i)

注意,使用 pop() 或 remove() 将在列表的索引中创建一个 pb,如果您在 if 之前打印 i,它将打印:[0, 0, 0],[255, 255, 255] 但是不是[3, 3, 3]

所以你应该更喜欢一些不就地的东西,比如:

my_new_list = [i for i in mylist if i!=[0,0,0]]

或者如果你在开头有一个数组:

my_new_array = np.array([i for i in myarray if (i!=0).all()])

my_new_array = np.array([i for i in myarray if any(i)]) # but specific to remove array of 0s.

希望对你有帮助

【讨论】:

    【解决方案4】:

    [0 0 0] 和“[0, 0, 0]”之间的区别? [0 0 0] 在 python 中什么都不是,除非你在零之间放一个逗号,在这种情况下它变成一个列表。 "[0,0,0]" 是一个字符串。

    t = [[0, 0, 0],[3, 3, 3],[255, 255, 255]]
    [f for f in t if f != [0,0,0]]
    

    会给你一个不是 0,0,0 的列表的列表

    我必须说你的问题不清楚。如果我的答案不是您想要的,请告诉我我缺少什么。

    【讨论】:

    • 好的,我应该让你知道我到目前为止所遵循的程序:我有一个图像。我打开它 im = Image.open('myimage.jpg')。然后我使用 pix = np.array(im) 从图像中获取像素值。但我想要一个特定的投资回报率,所以我创建一个零数组 roipix = np.zeros_like(pix) 并指定我想要保留像素值的区域:roipix[start:end:step,start:end:step]= allpix [start:end:step,start:end:step].print roipix--->[[ 0 0 0] [250 250 250] [255 255 255]...
    • Copying from stackoverflow.com/questions/21662532/…: ''问题是python中的 [...] 有两个不同的含义 expr [ index ] 表示访问列表的元素 [ expr1, expr2, expr3 ] 表示从三个表达式构建三个元素的列表。有道理,但无法理解与我的问题有何关联。
    猜你喜欢
    • 2021-10-19
    • 2021-10-03
    • 2013-06-08
    • 2020-07-01
    • 2019-02-15
    • 2014-05-01
    • 2015-10-25
    • 2023-03-17
    • 2021-11-03
    相关资源
    最近更新 更多