小编mar*_*ako的帖子

numpy数组的字符串表示形式,用逗号分隔其元素

我有一个numpy数组,例如:

points = np.array([[-468.927,  -11.299,   76.271, -536.723],
                   [-429.379, -694.915, -214.689,  745.763],
                   [   0.,       0.,       0.,       0.   ]])
Run Code Online (Sandbox Code Playgroud)

如果我打印它或用str()把它变成一个字符串我得到:

print w_points
[[-468.927  -11.299   76.271 -536.723]
 [-429.379 -694.915 -214.689  745.763]
 [   0.       0.       0.       0.   ]]
Run Code Online (Sandbox Code Playgroud)

我需要把它变成一个字符串,用逗号分隔打印,同时保持2D数组结构,即:

[[-468.927,  -11.299,   76.271, -536.723],
 [-429.379, -694.915, -214.689,  745.763],
 [   0.,       0.,       0.,       0.   ]]
Run Code Online (Sandbox Code Playgroud)

有没有人知道将numpy数组转换为字符串形式的简单方法?

我知道.tolist()会添加逗号,但结果会丢失2D结构.

python numpy

28
推荐指数
3
解决办法
2万
查看次数

是否可以将cython函数作为参数传递给scipy函数?

Scipy有许多函数接受python可调用来执行某些操作.特别是,我正在使用一个数学优化函数scipy.optimize.leastsq,它接受Python可调用作为目标函数参数.leastsq在最小化过程中,可以多次调用此目标函数.

我的分析表明,该目标函数花费了大量时间.我已经使用Cython加速了函数的某些部分.但是,函数本身仍然是一个Python函数,并且重复调用它(就像leastsq)一样有一些开销.

如果函数是一个Cython函数(使用cdef而不是def),我想我可以进一步提高速度.所以我把我的调用leastsq放在Cython扩展内部并将一个Cython目标函数传递给它.但是当我这样做时,我 调用时遇到编译错误leastsq :

Cannot convert 'object (object, object, object)' to Python object
Run Code Online (Sandbox Code Playgroud)

有没有办法将Cython函数作为参数传递给需要python callables的Scipy函数?

或者,在我的情况下,有没有办法访问底层 leastsq 实现并将Cython目标函数传递给它?

cython scipy

7
推荐指数
1
解决办法
1183
查看次数

Cython:numpy数组的unsigned int索引给出了不同的结果

我通过添加一些类型并编译它来转换为cython python函数.我在python和cython函数的结果之间得到了很小的数值差异.经过一些工作,我发现差异来自使用unsigned int而不是int访问numpy数组.

我正在使用unsigned int索引来加速访问,具体如下:http://docs.cython.org/src/userguide/numpy_tutorial.html#tuning-indexing-further

无论如何,我认为使用无符号的整数是无害的.

看到这段代码:

cpdef function(np.ndarray[np.float32_t, ndim=2] response, max_loc):
    cdef unsigned int x, y   
    x, y = int(max_loc[0]), int(max_loc[1])
    x2, y2 = int(max_loc[0]), int(max_loc[1])
    print response[y,x], type(response[y,x]), response.dtype
    print response[y2,x2], type(response[y2,x2]), response.dtype   
    print 2*(response[y,x] - min(response[y,x-1], response[y,x+1]))
    print 2*(response[y2,x2] - min(response[y2,x2-1], response[y2,x2+1]))  
Run Code Online (Sandbox Code Playgroud)

打印:

0.959878861904 <type 'float'> float32
0.959879 <type 'numpy.float32'> float32
1.04306024313
1.04306030273   
Run Code Online (Sandbox Code Playgroud)

为什么会这样?!!! 这是一个错误吗?

好的,这里要求的是一个SSCCE,它具有我在原始函数中使用的相同类型和值

cpdef function():
    cdef unsigned int x, y  
    max_loc2 = np.asarray([ 15., 25.], dtype=float) 
    cdef np.ndarray[np.float32_t, ndim=2] response2 = …
Run Code Online (Sandbox Code Playgroud)

python numpy cython

7
推荐指数
1
解决办法
1296
查看次数

当 pickle 一个类时,我在 python 中得到与 cython 中不同的行为

我有以下文件层次结构:

python/apps/A.py
      /geometrylib/__init__.py
      /geometrylib/B.py
      /geometrylib/geometry.py
      /geometrylib/goemetry.pyx
      /geometrylib/goemetry.pyd
Run Code Online (Sandbox Code Playgroud)

Geometry.pyx 和 Geometry.py 包含相同的 Camera 类(cython 版本使用 cdef 定义该类)。A.py 和 B.py 都导入几何模块。

如果我导入 cython 版本(编译为 Geometry.pyd),我可以从 python/geometrylib 文件夹中的 B.py 中正确pickle Camera。但我无法从 python/apps 文件夹中的 A.py 中 pickle Camera,出现以下异常:

pickle.PicklingError:无法pickle:找不到geometry.Camera

但是,如果我删除geometry.pyd并导入python版本(geometry.py),那么我可以从A.py或B.py中pickle Camera。除了删除geometry.pyd之外,没有其他任何变化,相同的python命令行,在两种情况下都从相同的文件夹运行。 为什么会有这种差异?

挖掘了一下,我发现异常发生在 C:\Python27\Lib\pickle.py 第 742 行

try:
    __import__(module)            #line 742
    mod = sys.modules[module]
    klass = getattr(mod, name)
except (ImportError, KeyError, AttributeError):
    raise PicklingError(
        "Can't pickle %r: it's not found as %s.%s" %
        (obj, module, name))
Run Code Online (Sandbox Code Playgroud)

在 A.py 中,我导入 cython 版本(geometry.pyd)(并且我腌制了一个 Camera 实例以触发期望)模块是“geometry”并__import__(module) …

python import pickle cython

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

cython 函数输出与 python 函数输出略有不同

我通过向某些变量添加类型将 python 函数转换为等效的 cython。但是,cython 函数产生的输出与原始 python 函数略有不同。

我在这篇文章Cython 中了解到了这种差异的一些原因 :numpy 数组的 unsigned int 索引给出了不同的结果 但是即使我在这篇文章中学到了什么,我仍然无法让 cython 函数产生相同的结果作为蟒蛇之一。

所以我整理了 4 个函数来说明我的尝试。有人可以帮助揭示为什么我对每个函数的结果略有不同吗?以及如何获得返回与 function1 完全相同的值的 cython 函数?我在下面发表一些评论:

%%cython
import numpy as np
cimport numpy as np    

def function1(response, max_loc):    
    x, y = int(max_loc[0]), int(max_loc[1])

    tmp1 = (response[y,x+1] - response[y,x-1]) / 2*(response[y,x] - min(response[y,x-1], response[y,x+1]))
    tmp2 = (response[y,x+1] - response[y,x-1])
    tmp3 = 2*(response[y,x] - min(response[y,x-1], response[y,x+1]))

    print tmp1, tmp2, tmp3        
    return tmp1, tmp2, tmp3

cpdef function2(np.ndarray[np.float32_t, ndim=2] response, np.ndarray[np.float64_t, ndim=1] max_loc):
    cdef …
Run Code Online (Sandbox Code Playgroud)

python numpy cython

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

矢量化numpy对于子阵列是唯一的

我有一个形状(N,20,20)的numpy数组数据,N是一些非常大的数字.我想获得每个20x20子阵列中唯一值的数量.循环将是:

values = []
for i in data:
    values.append(len(np.unique(i)))
Run Code Online (Sandbox Code Playgroud)

我怎么能对这个循环进行矢量化?速度是一个问题.

如果我尝试np.unique(数据),我得到整个数据数组的唯一值,而不是单独的20x20块,所以这不是我需要的.

python numpy

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

优化/删除循环

我有以下代码,我想使用numpy进行优化,最好是删除循环.我看不出如何接近它,所以任何建议都会有所帮助.

indices是一个(N,2)numpy整数数组,N可以是几百万.代码的作用是在第一列中找到重复的索引.对于这些索引,我在第二列中进行了两个相应索引的所有组合.然后我将它们与第一列中的索引一起收集.

index_sets = []
uniques, counts = np.unique(indices[:,0], return_counts=True)
potentials = uniques[counts > 1]
for p in potentials:
    correspondents = indices[(indices[:,0] == p),1]
    combs = np.vstack(list(combinations(correspondents, 2)))
    combs = np.hstack((np.tile(p, (combs.shape[0], 1)), combs))
    index_sets.append(combs)
Run Code Online (Sandbox Code Playgroud)

python numpy networkx

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

Matplotlib 可拖动数据标记

我需要一个可拖动的数据标记来手动调整数据集中的一组点。 这个答案和其他人使用 Patch.Circle 解决了这个问题。但是,我需要在缩放绘图时标记保持相同的大小。对于圆圈,圆圈也会缩放。我还没有尝试找到一种在每次新缩放时动态调整圆圈大小的方法,因为看起来应该有一种更简单的方法来移动标记。有人知道怎么做这个吗?

python matplotlib

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

在 QtCreator 中禁用 linux 鼠标滚轮单击粘贴

我公司的办公桌上有这些鼠标,在我滚动滚轮的 50% 的时间里,它会产生中键点击。在linux中,这是一个粘贴。所以当我在 QtCreator 中上下滚动一些源代码时,我倾向于无意中粘贴文本片段。即使我痛苦地意识到这种影响,它仍然会发生并且让我发疯。通过更改设置editor.selectionClipboard,我能够断开 VSCode 中的中间按钮粘贴。我试图在 QtCreator 中找到类似的设置,但我不能。有没有办法在 QtCreator 中实现这一点?

我不想在整个系统范围内禁用这个中间按钮,因为这个功能对于在终端中粘贴代码/文本片段非常有用,在那里我不像在源代码编辑器中那样滚动。

linux copy-paste mousewheel qt-creator

5
推荐指数
0
解决办法
403
查看次数

将cython memoryviews传递给OpenCV函数

我正在使用cython memoryviews来引用一些灰度图像.我已经在我编写的一些图像处理代码中成功使用了它.现在,我需要使用一些OpenCV函数.不幸的是,我发现我无法将内存视图作为图像参数传递给OpenCV函数.代码编译,但是当它运行时,它在OpenCV函数调用时停止,并出现"TypeError:不是一个numpy数组"

我可以使用np.asarray(my_memoryview)将memoryview转换回numpy数组.这有效,但它复制数据并且速度很慢.

在memoryview文档中,他们谈论强制到numpy http://docs.cython.org/src/userguide/memoryviews.html#coercion-to-numpy 似乎我应该能够将内存视图强制为numpy数组没有复制内存.但是,如果我写:

im = np.asarray(<np.uint8_t[:, :]> my_memoryview)
Run Code Online (Sandbox Code Playgroud)

它导致编译错误:"只能从指针或数组创建cython.array"

有关如何将内存视图传递给OpenCV函数的任何帮助,或者如何将内存视图强制转换为numpy数组而不复制数据将非常感激!

opencv numpy cython memoryview

4
推荐指数
1
解决办法
925
查看次数