小编Gio*_*ker的帖子

Cython类型的记忆观点:它们到底是什么?

Cython 文档很好地解释了它们允许的内容,如何声明它们以及如何使用它们.

但是,我仍然不清楚他们到底是什么.例如,来自numpy数组的简单赋值如下:

my_arr = np.empty(10, np.int32)
cdef int [:] new_arr = my_arr
Run Code Online (Sandbox Code Playgroud)

可以使访问/分配my_arr更快.

幕后发生了什么?Numpy应该已经以连续的方式在内存中分配元素了,那么内存视图的处理是什么?显然不是那么多,实际上numpy数组的memoryview赋值new_arr应该相当于

cdef np.ndarray[np.int32_t, ndim=1] new_arr = np.empty(10, np.int32)
Run Code Online (Sandbox Code Playgroud)

在速度方面.但是,内存视图被认为比numpy数组缓冲区更通用; 你能举一个简单的例子,其中添加的"概括"是重要/有趣的吗?

此外,如果我已经分配了一个指针以使事情尽可能快,那么将它转换为类型化的内存视图有什么好处?(这个问题的答案可能与上面的问题相同)

cdef int *my_arr = <int *> malloc(N * sizeof(int))
cdef int[:] new_arr = <int[:N]>my_arr
Run Code Online (Sandbox Code Playgroud)

python arrays cython memoryview

15
推荐指数
1
解决办法
4554
查看次数

使用Numpy生成两个数组的随机组合而不重复

例如[0,0,0],给定两个数组,[1,1,1]已经清楚(见此处)如何生成所有组合,即[[0,0,0],[0,0,1],[0,1,0],[0,1,1],[1,0,0],[1,0,1],[1,1,0],[1,1,1]].itertools(combinationsproduct)并且numpy.meshgrid是我所知道的最常见的方式.

但是,我找不到关于如何随机生成这种组合的任何讨论,而不重复.

一个简单的解决方案可能是生成所有组合,然后随机选择其中一些.例如:

# Three random combinations of [0,0,0] and [1,1,1]
comb = np.array(np.meshgrid([0,1],[0,1],[0,1])).T.reshape(-1,3)
result = comb[np.random.choice(len(comb),3,replace=False),:]
Run Code Online (Sandbox Code Playgroud)

然而,当组合的数量太大时,这是不可行的.

有没有办法生成随机组合而无需在Python中替换(可能使用Numpy)而不生成所有组合?

编辑:您可以在接受的答案中注意到,我们也免费获得了一种生成随机二进制向量而无需重复的技术,这只是一条线(在红利部分中描述).

python random numpy

5
推荐指数
1
解决办法
829
查看次数

使用Numpy数组和列表进行多次赋值,这是一个奇怪的例子

考虑多重分配x[0],y = y,x[0].应用于以下四种情况中的每一种情况,这给出了四种不同的结果.

看起来列表的多重分配比Numpy阵列的多重分配更智能(自动通过临时变量).

思考?

编辑:事后并不聪明......

python numpy assignment-operator python-internals

2
推荐指数
1
解决办法
505
查看次数