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) 例如[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(combinations或product)并且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)而不生成所有组合?
编辑:您可以在接受的答案中注意到,我们也免费获得了一种生成随机二进制向量而无需重复的技术,这只是一条线(在红利部分中描述).
考虑多重分配x[0],y = y,x[0].应用于以下四种情况中的每一种情况,这给出了四种不同的结果.
情况1:
x = [[1,2], [3,4]]
y = [5,6]
Run Code Online (Sandbox Code Playgroud)
给
x = [[5,6], [3,4]]
y = [1,2]
Run Code Online (Sandbox Code Playgroud)案例2:
x = np.array([[1,2], [3,4]])
y = [5,6]
Run Code Online (Sandbox Code Playgroud)
给
x = array([[5,6], [3,4]])
y = array([5,6])
Run Code Online (Sandbox Code Playgroud)案例3:
x = [[1,2], [3,4]]
y = np.array([5,6])
Run Code Online (Sandbox Code Playgroud)
给
x = [array([5,6]), [3,4]]
y = [1,2]
Run Code Online (Sandbox Code Playgroud)案例4:
x = np.array([[1,2], [3,4]])
y = np.array([5,6])
Run Code Online (Sandbox Code Playgroud)
给
x = array([[5,6], [3,4]])
y = array([5,6])
Run Code Online (Sandbox Code Playgroud)看起来列表的多重分配比Numpy阵列的多重分配更智能(自动通过临时变量).
思考?
编辑:事后并不聪明......