【问题标题】:How to rearrange numpy arrays stored in a list based on the lengths of the arrays如何根据数组的长度重新排列存储在列表中的numpy数组
【发布时间】:2021-05-12 09:32:54
【问题描述】:

我有一个 numpy 数组列表,并希望根据每个数组的长度重新排列它。这是我的清单:

nums=[np.array([[2.], [3.]]), np.array([[8.], [7.], [1.]]),\
      np.array([[1.], [0.], [5.]]), np.array([[8.], [9.]]), np.array([[7.], [6.]])]

当数组的长度发生变化时,这一点很重要。长度列表是:

lns=[2, 3, 3, 2, 2]

基于lns,长度从第一个数组变为第二个数组。第一个数组更短,我想要它的所有行。我想要2(较短数组的长度)行较长(第二)行。在这种情况下,较短数组 (2.5) 的平均值小于较长数组 (5.3) 的平均值,因此我提取了较长数组的第一行 2。我想要第二个和第三个数组,因为它们的长度是最大的。从第三到第四长度变化。同样,我想要所有更短的行和2(更短的长度,即第四行)。但是,较短 (8.5) 的平均值高于较长 (2.)。所以,我需要较长的最后一行2。最后,我想重新排列我的列表以获得以下列表:

final=[np.array([[2.], [3.], [8.], [7.]]),\ # all rows of first and first 2 rows of second
       np.array([[8.], [7.], [1.], [1.], [0.], [5.]]),\
       np.array([[0.], [5.], [8.], [9.], [7.], [6.]])]# last 2 rows of third and all rows of next short arrays

感谢任何帮助我在 python 中做我想做的事。

【问题讨论】:

  • 1. 显示您尝试过的内容。 2. 你的逻辑有点过于复杂了。第一个数组的长度为 2,但在 final 中它的长度为 4。3. 为什么第二个和第三个数组在 final 中合并为一个数组?因为长度一样? 4. 取前 2 个元素(较短的 neighbour 的长度)还是取最后 2 个元素是基于两个数组的平均值?还是基于哪个数组先出现? 5. 您使用了 numpy 数组但未标记 numpy。您实际上是在使用 numpy 数组还是 Python 数组或常规 Python 列表?
  • 好的,所以根据另一个问题,你会得到一个任意的点列表(在 2D 空间中,在另一个问题中,但实际上是 3D 空间),可能 表示形状。并且您想在 2D/3D 中创建相交的形状;并忽略不能形成封闭多边形的点(所以线不好)。有这样的描述更好。此外,1D 版本也无济于事,因为它有一些不相关的因素——比如取平均值。如果两个相邻的形状有非常不同的大小并且没有连接,那么做那个“平均”的事情没有任何帮助。
  • 附言。你不需要每次都说亲爱的。零次/一次就足够了:-)
  • 我会说等一下再打开更多问题。如果 48 小时后没有满意的答案,您可以在另一个问题上add a bounty。我可以尝试回答这个问题,但它实际上并不能解决您在原始问题上遇到的问题。
  • @aneroid,实际上我的观点是 3d(x,yz)。但我只根据xy 重新排列它们。

标签: python arrays algorithm split


【解决方案1】:

1。首先,我使用pairwise() recipe from itertools 一次获取两个连续元素,而不是使用索引:

import itertools

# https://docs.python.org/3/library/itertools.html#itertools-recipes
def pairwise(iterable):
    "s -> (s0,s1), (s1,s2), (s2, s3), ..."
    a, b = itertools.tee(iterable)
    next(b, None)
    return zip(a, b)

2。我创建了一个辅助函数first_or_last(),它返回一个slice object,它可以是used on a numpy array,并应用于两个相邻数组中较大的一个进行比较3。根据您上面描述的逻辑,需要应用哪个切片取决于平均值/平均值。如果需要,您可以将其简化为两行函数,我已将较长的版本用于 cmets/explanation。

def first_or_last(smaller, larger):
    """return a slice object for either the first-n items or
    the last-n items of the larger array
    """
    size = len(smaller)
    if np.mean(smaller) < np.mean(larger):
        # take first-`size` elements
        return slice(None, size)
    # take last-`size` elements
    return slice(-size, None)  # don't skip the extra None, needed for axes
    # or just
    # return slice(None, size) if np.mean(smaller) < np.mean(larger) else slice(-size, None)

3 .重新排列的代码:

nums = [np.array([[2.], [3.]]), np.array([[8.], [7.], [1.]]),
        np.array([[1.], [0.], [5.]]), np.array([[8.], [9.]]),
        np.array([[7.], [6.]])]

final = []
for ar1, ar2 in pairwise(nums):
    l1, l2 = len(ar1), len(ar2)
    if l1 == l2:  # same length
        final.append(np.append(ar1, ar2, axis=0))
        continue
    # different lengths
    arrs = (ar1, ar2[first_or_last(ar1, ar2)]) if l1 < l2 else (ar1[first_or_last(ar2, ar1)], ar2)
    final.append(np.append(*arrs, axis=0))

final 的值:

[array([[2.], [3.], [8.], [7.]]),
 array([[8.], [7.], [1.], [1.], [0.], [5.]]),
 array([[0.], [5.], [8.], [9.]]),
 array([[8.], [9.], [7.], [6.]])]

注意事项:

  1. 此输出与您所拥有的 final 不同。请参阅item #9 in my comment,因为我看不到使结果包含 3 个项目而不是 4 个项目的规则/逻辑。

    9. 另一个逻辑不一致:对于数组 3 (len 3) 和数组 4 (len 2),结果应该是0 5 8 9,结果中的最后一项应该是@ 987654338@。为什么最后会合并为0 5 8 9 7 6?他们应该是分开的。对于第 3、第 4 和第 5 个数组而不是第 1、第 2 和第 3 个数组合并它们的逻辑是什么?

  2. 此解决方案不会为 your previous/original question 提供错误,但它似乎也不是正确的输出 - 尽管它确实遵循相同的规则。

  3. NumPy 数组切片返回原始数组的视图,而不是副本。

【讨论】:

  • 感谢您的解决方案。但是,假设所有数组的长度都是 3。然后,我只想要一个数组,因为它们都有最大长度。或者例如让我们考虑第一个数组的长度也是 3,那么我只想有两个数组。你能以某种方式将这个解决方案集中到我在另一篇文章中提到的问题上吗?提前感谢您的任何反馈。
  • 再一次,我看不出适用于此的底层逻辑是什么。您可以添加“如果下一个数组与最后一个数组的长度相同,则将其附加到前一个数组”。建议您添加一个last_arrar1 和/或ar2 进行比较,并检查/标记ar2 在上一次迭代中是否被切片等。如果是这样,则将其附加到上一个结果而不是作为一个新行:final[-1] = np.append(final[-1], ar1, axis=0)(如果需要,也可以使用ar2)。没有切片检查,see this modification on pastebin.
猜你喜欢
  • 1970-01-01
  • 2016-08-24
  • 2013-12-14
  • 2014-11-29
  • 1970-01-01
  • 2020-01-12
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多