当前位置: 首页 > 面试题库 >

独立移动numpy数组的行

谢裕
2023-03-14
问题内容

这是这里提出的问题的扩展(在下面引用)

我有一个矩阵(准确地说是2d numpy ndarray):

A = np.array([[4, 0, 0],
              [1, 2, 3],
              [0, 0, 5]])

我想根据另一个数组中的滚动值独立滚动A的每一行:

r = np.array([2, 0, -1])

也就是说,我要这样做:

print np.array([np.roll(row, x) for row,x in zip(A, r)])

[[0 0 4]
 [1 2 3]
 [0 5 0]]

有办法有效地做到这一点吗?也许使用花哨的索引技巧?

可接受的解决方案是:

rows, column_indices = np.ogrid[:A.shape[0], :A.shape[1]]

# Use always a negative shift, so that column_indices are valid.
# (could also use module operation)
r[r < 0] += A.shape[1]
column_indices = column_indices - r[:,np.newaxis]

result = A[rows, column_indices]

我基本上想做同样的事情,除了当索引被滚动“粘贴”到行的末尾时,我希望用NaN填充行的另一侧,而不是将值移到“前”定期排成一行。

也许以np.pad某种方式使用?但是我无法弄清楚如何用不同的数量填充不同的行。


问题答案:

受矩阵解决方案的滚行启发,以下是基于np.lib.stride_tricks.as_strided-

from skimage.util.shape import view_as_windows as viewW

def strided_indexing_roll(a, r):
    # Concatenate with sliced to cover all rolls
    p = np.full((a.shape[0],a.shape[1]-1),np.nan)
    a_ext = np.concatenate((p,a,p),axis=1)

    # Get sliding windows; use advanced-indexing to select appropriate ones
    n = a.shape[1]
    return viewW(a_ext,(1,n))[np.arange(len(r)), -r + (n-1),0]

样品运行-

In [76]: a
Out[76]: 
array([[4, 0, 0],
       [1, 2, 3],
       [0, 0, 5]])

In [77]: r
Out[77]: array([ 2,  0, -1])

In [78]: strided_indexing_roll(a, r)
Out[78]: 
array([[nan, nan,  4.],
       [ 1.,  2.,  3.],
       [ 0.,  5., nan]])


 类似资料:
  • 问题内容: 几年前从这个问题开始,在numpy中是否有规范的“移位”功能?我从文档中看不到任何东西。 这是我正在寻找的简单版本: 使用它就像: 这个问题来自于我昨天尝试[编写快速滚动产品的](http://codingdict.com/questions/163825尝试。我需要一种“转移”累积乘积的方法,我所能想到的就是在中复制逻辑。 因此比快得多。此版本的功能执行得更好: 更快的版本只是简单地

  • 我的目标是为现有应用程序启用架构和数据迁移。 这种问题似乎已经被问过很多次了,不过我想是因为不同的要求和环境。 由于我在这个领域没有经验,请允许我先介绍一下应用程序的架构和我的假设。 该应用程序是一个多用户企业桌面应用程序,具有后端服务器,可以持久保存到任何主要数据库(MySql,Postgresql,SQL服务器,Oracle数据库等)。假设数据库是内部部署的,并由我们的客户维护。 使用的技术堆

  • 问题内容: 我有一个像这样的numpy数组: 并想创建一个数组,其中索引0中的值在索引1中,索引1在索引2中,依此类推。 我想要的输出是: 我猜想有一个简单的方法可以做到这一点,而无需遍历整个数组。我如何以numPythonic的方式做到这一点? 问题答案: 您可以使用 要么

  • 问题内容: 所以我有一组数据,可以转换为R,G,B波段的单独的numpy数组。现在,我需要将它们组合以形成RGB图像。 我尝试使用“图像”来完成这项工作,但需要将“模式”归因于此。 我试图做个把戏。我将使用Image.fromarray()将数组带到图像,但是当Image.merge要求合并“ L”模式图像时,默认情况下它会达到“ F”模式。如果我首先将fromarray()中array的属性声明

  • 问题内容: 我在创建numpy数组的numpy数组时遇到问题。我将在一个循环中创建它: 所需结果: 实际结果: 可能吗?我不知道数组的最终尺寸,因此无法使用固定尺寸对其进行初始化。 问题答案: 永远不要在循环中追加数组:与基本的Python相比,这是NumPy非常不擅长的一项操作。这是因为您要对每个数据进行完整复制,这将花费您二次时间。 相反,只需将您的数组附加到Python列表中,并在最后进行转

  • 但我还是不太明白发生了什么。 例如,如果我有一行[1,2,3,4,5],如果我把这些数字加到行的前面或后面,结果是什么?