- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我正在寻找一种更有效地分配 numpy 结构化数组列的方法。
例子:
my_col = fn_returning_1D_array(...)
在我的机器上执行速度比对结构化数组的列执行相同的分配快两倍以上:
test = np.ndarray(shape=(int(8e6),), dtype=dtype([('column1', 'S10'), ...more columns...]))
test['column1'] = fn_returning_1D_array(...)
我尝试使用 Fortran 顺序创建 test
但它没有帮助。据推测,这些字段在内存中保持交错。
有人知道吗?如果可以的话,我愿意使用低级 numpy 接口(interface)和 cython。
仅当后者以行优先顺序创建时,recarray 列分配和“正常”数组列分配的明显等价性才会产生。对于列优先排序,这两个分配远非等效:
行优先
In [1]: import numpy as np
In [2]: M,N=int(1e7),10
In [4]: A1=np.zeros((M,N),'f')
In [9]: dt=np.dtype(','.join(['f' for _ in range(N)]))
In [10]: A2=np.zeros((M,),dtype=dt)
In [11]: X=np.arange(M+0.0)
In [13]: %timeit for n in range(N):A1[:,n]=X
1 loops, best of 3: 2.36 s per loop
In [15]: %timeit for n in dt.names: A2[n]=X
1 loops, best of 3: 2.36 s per loop
In [16]: %timeit A1[:,:]=X[:,None]
1 loops, best of 3: 334 ms per loop
In [8]: A1.flags
Out[8]:
C_CONTIGUOUS : True
F_CONTIGUOUS : False
OWNDATA : True
WRITEABLE : True
ALIGNED : True
UPDATEIFCOPY : False
专栏主要
In [1]: import numpy as np
In [2]: M,N=int(1e7),10
In [3]: A1=np.zeros((M,N),'f', 'F')
In [4]: dt=np.dtype(','.join(['f' for _ in range(N)]))
In [5]: A2=np.zeros((M,),dtype=dt)
In [6]: X=np.arange(M+0.0)
In [8]: %timeit for n in range(N):A1[:,n]=X
1 loops, best of 3: 374 ms per loop
In [9]: %timeit for n in dt.names: A2[n]=X
1 loops, best of 3: 2.43 s per loop
In [10]: %timeit A1[:,:]=X[:,None]
1 loops, best of 3: 380 ms per loop
In [11]: A1.flags
Out[11]:
C_CONTIGUOUS : False
F_CONTIGUOUS : True
OWNDATA : True
WRITEABLE : True
ALIGNED : True
UPDATEIFCOPY : False
请注意,对于列优先排序,两个缓冲区不再相同:
In [6]: A3=np.zeros_like(A2)
In [7]: A3.data = A1.data
In [20]: A2[0]
Out[20]: (0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0)
In [21]: A2[1]
Out[21]: (1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0)
In [16]: A3[0]
Out[16]: (0.0, 1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0)
In [17]: A3[1]
Out[17]: (10.0, 11.0, 12.0, 13.0, 14.0, 15.0, 16.0, 17.0, 18.0, 19.0)
最佳答案
这些不是等效的操作。一个只是生成一个数组(并将其分配给一个变量,一个小 Action )。另一个生成数组并填充结构化数组的列。
my_col = fn_returning_1D_array(...)
test['column1'] = fn_returning_1D_array(...)
我认为更公平的比较是填充二维数组的列。
In [38]: M,N=1000,10
In [39]: A1=np.zeros((M,N),'f') # 2D array
In [40]: dt=np.dtype(','.join(['f' for _ in range(N)]))
In [41]: A2=np.zeros((M,),dtype=dt) # structured array
In [42]: X=np.arange(M+0.0)
In [43]: A1[:,0]=X # fill a column
In [44]: A2['f0']=X # fill a field
In [45]: timeit for n in range(N):A1[:,n]=X
10000 loops, best of 3: 65.3 µs per loop
In [46]: timeit for n in dt.names: A2[n]=X
10000 loops, best of 3: 40.6 µs per loop
我有点惊讶填充结构化数组的速度更快。
当然,填充二维数组的快速方法是使用广播:
In [50]: timeit A1[:,:]=X[:,None]
10000 loops, best of 3: 29.2 µs per loop
但是填充字段的改进并不是那么大。
我没有发现逐字段填充结构化数组有什么明显的错误。它必须比生成元组列表来填充整个数组更快。
我相信 A1
和 A2
具有相同的数据缓冲区。例如,如果我制作 A2 的零副本,我可以用 A1 的
替换它的数据缓冲区,并得到一个有效的结构化数组
In [64]: A3=np.zeros_like(A2)
In [65]: A3.data=A1.data
因此,填充结构化数组的更快方法是进行最快的二维填充,然后是此data
赋值。
但在一般情况下,挑战在于创建兼容的二维数组。当所有字段数据类型都相同时,这很容易。使用混合数据类型,您必须在字节级别工作。有一些高级的 dtype
规范(带有偏移量等)可以促进这种映射。
现在您已将焦点转移到 Fortran 顺序。在二维数组的情况下确实有帮助。但这样做会以面向行的操作为代价。
In [89]: A1=np.zeros((M,N),'f',order='F')
In [90]: timeit A1[:,:]=X[:,None]
100000 loops, best of 3: 18.2 µs per loop
您没有提到的一件事是您打算如何使用这个数组,至少在最后一次重写问题之前没有提到。如果它只是一个按名称存储多个数组的地方,您可以使用直接的 Python 字典:
In [96]: timeit D={name:X.copy() for name in dt.names}
10000 loops, best of 3: 25.2 µs per loop
尽管这确实是对 X.copy()
的时间测试。
无论如何,在处理数据类型时,没有任何等同于 Fortran 顺序的方法。 reshape
、swapaxes
、strides
、广播等数组操作都没有跨越“dtype”边界。
关于python - Fortran 有序(列优先)numpy 结构化数组可能吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29719324/
就类似于这个问题:mongodb query multiple pairs using $in 我想用 (first, last) >= ('John', 'Smith') 找到前 10 个全名。使用
如何保留向 NSDictionary 添加对象的方式? 我意识到 NSDictionary 中的值没有特定的顺序,但就我而言,我需要保留使用 setValue:forKey: 添加的顺序,例如一个数组
看看上证所运营商 CMPORDPS - ordered compare packed singles CMPUNORDPS - unordered compare packed singles 有序和
我使用 PowerMock 来模拟静态方法。我需要验证静态和非静态方法调用的顺序。可以使用 PowerMock 来做吗? UPD 我使用 powermockito 扩展来模拟静态方法,因此使用 pow
例如,如何合并两个已排序的整数流?我认为这是非常基本的,但只是发现它根本不是微不足道的。下面的不是尾递归的,当流很大时它会堆栈溢出。 def merge(as: Stream[Int], bs: St
我试图在二叉树中查找/打印每个节点的中序后继,但编译器给我的结果是段错误。 这是结构:- struct node { int x; struct node *left; str
我有一个查询看起来像 SELECT a, b, c, d FROM tab ORDER BY a ASC, b ASC 我的结果集看起来像 +-----------------
首先,我试过搜索这个主题但一无所获(似乎找不到合适的关键词),所以如果这是重复的,请告知。 我一直在尝试从我的数据库中获取一些 time_stamp 并将它们按时间间隔排序。例如,我运行一个查询,如
这个问题在这里已经有了答案: How do I get the index of an iterator of an std::vector? (9 个回答) 关闭 6 年前。 我已经订购了 QVe
我有以下实体,如果我尝试通过 removeTask 方法从 TaskList 中删除 Task,则会出现异常。 @Entity public class TaskList extends Generi
所以,我对 C 编程还是很陌生。 有3个长度相同的字符串。 str1="abc", str2="def", str3="ghi". 新字符串中的输出将类似于“adgbehcfi”。 #include
我的查询有一个问题,它花费的时间太长(仅仅这个简单的查询就超过了两秒)。 乍一看,这似乎是一个索引问题,所有连接的字段都已编入索引,但我找不到其他我可能需要编入索引以加快速度的内容。一旦我将我需要的字
我正在寻找一个 Map 实现,它按照键值对的添加顺序迭代它们。例如 Map orderedMap = // instantiation omitted for obvious reasons :) o
我正在寻找具有以下功能的数据库系统: 分层(多维)键 每个维度的键排序 因此,如果我的 key 类似于 App > User > Item,我可以运行如下查询:“该用户的下一项是什么?”或者“这个应用
以下类使用 CRTP 尝试将类型添加到具有 Schwarz 计数器以确保初始化顺序的 std::vector。根据 3.6.2/2 成员 h_ 具有无序初始化。我将如何更改它以确保它已订购初始化?我希
我正在实现一个玩具调度程序,它读取进程规范(例如到达时间、总运行时间)的输入文件,然后根据随机 io/cpu 突发调度进程。 文件格式 Arrival time, total CPU time, CP
我目前正在使用 python 2.7 requests 库,并且不支持有序 header 。我可以为 post 和 get 放置有序数据(如有序字典),但根本不支持标题。甚至在 python 3 中也
我正在使用来自 google guava 的 ConcurrentHashMap(通过 MapMaker),但该实现未排序。google guava 中有 ConcurrentSkipListMap,
我有一个旧应用程序,其中使用 ConcurrentHashMap。现在我们知道并发HasMap 是无序的,但是需要读取最初插入的对象。我已经在生产中使用了一段时间的代码,因此我正在寻找快速替代方案来替
最近我开始使用 .NET Core 2.1 开发一个新项目,我决定使用 SOLID 原则并创建一个漂亮的项目结构。 这是一个 Web API 项目。一切正常我使用了很多依赖注入(inject),大部分
我是一名优秀的程序员,十分优秀!