当前位置: 首页 > 知识库问答 >
问题:

用步长组成numpy数组

柳墨一
2023-03-14

我有一个数组a1_ijk,并希望将其广播到a2_ijmnk,但仅适用于m=n的情况。否则a2应该用零填充。当然,我可以创建新的空数组并用a1填充它,如下所示:

import numpy as np
A1 = np.random.rand(100, 5, 3)
A2 = np.zeros((100, 5, 2, 2, 3))
A2[..., 0, 0, :] = A1
A2[..., 1, 1, :] = A1
as_strided = np.lib.stride_tricks.as_strided
sz = A1.itemsize
A2 = as_strided(A1, shape=(100,5,2,2,3), strides=(5*3*sz, 3*sz, 0, 0, sz))
broadcast_to = np.lib.stride_tricks.broadcast_to
A2=broadcast_to(A1[...,None,None,:], (100,5,2,2,3))

不幸的是,这两个方法都用A1值填充所有m,n对。

我的问题是,如果这是可能的创建数组的形状我需要使用大步和没有实际复制数据?

共有1个答案

爱唯
2023-03-14

我的问题是,这是否可能使用步幅来创建我需要的形状的数组,使用步幅而不实际复制数据?

才不是。作为一个简单的方法,考虑如果您的数组中没有零,那么该数组的任何视图都不会给出您所需的非对角线零。

 类似资料:
  • 问题内容: 可以说我有一个Python Numpy数组。 我想从步长为3的长度为5的数组创建一个子序列矩阵,因此结果矩阵如下所示: 实现此目的的一种可能方法是使用faor循环。 有没有更干净的方法可以在Numpy中实现呢 问题答案: 方法#1: 使用broadcasting 方法2:使用更有效的方法NumPy strides 样品运行

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

  • 问题内容: 要求: 我需要从数据中任意增加一个数组。 我可以猜测大小(大约100-200),但不能保证每次都适合该数组 一旦增长到最终大小,我就需要对其进行数值计算,因此我更希望最终使用二维numpy数组。 速度至关重要。例如,对于300个文件之一,update()方法被称为4500万次(大约需要150秒),而finalize()方法被称为500k次(总共需要106s)……总共需要250s或者。

  • 问题内容: 这就是您如何将列表分成大小均匀的块? 用于将数组拆分为多个块。无论如何,对于使用Numpy的巨型阵列,这样做是否更有效率? 问题答案: 尝试。 从文档中: 与相同,但如果组的长度不相等,则不会引发异常。 如果块数> len(array),您将获得嵌套在内部的空白数组,以解决此问题-如果将拆分数组保存在中,则可以通过以下方式删除空数组: 只需将其保存回去即可。

  • 问题内容: 我有一个形状为(x,y)的2d数组,我想将其转换为形状为(x,y,1)的3d数组。有没有很好的Pythonic方式可以做到这一点? 问题答案: 除了其他答案,您还可以将切片与结合使用: 甚至这个(可以在任意数量的尺寸下使用):

  • 问题内容: 我希望能够“快速”构建一个numpy数组,但我不知道该数组的大小。 例如,我想做这样的事情: 这将导致包含x的所有元素,这显然是一个简单的答案。我很好奇这是否可能? 问题答案: 构建一个Python列表并将其转换为Numpy数组。每个附加项需要O(1)的摊销时间+ O( n )才能转换为数组,总共需要O( n )。