我有一个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结构.
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 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/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 函数转换为等效的 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) 我有一个形状(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块,所以这不是我需要的.
我有以下代码,我想使用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) 我需要一个可拖动的数据标记来手动调整数据集中的一组点。 这个答案和其他人使用 Patch.Circle 解决了这个问题。但是,我需要在缩放绘图时标记保持相同的大小。对于圆圈,圆圈也会缩放。我还没有尝试找到一种在每次新缩放时动态调整圆圈大小的方法,因为看起来应该有一种更简单的方法来移动标记。有人知道怎么做这个吗?
我公司的办公桌上有这些鼠标,在我滚动滚轮的 50% 的时间里,它会产生中键点击。在linux中,这是一个粘贴。所以当我在 QtCreator 中上下滚动一些源代码时,我倾向于无意中粘贴文本片段。即使我痛苦地意识到这种影响,它仍然会发生并且让我发疯。通过更改设置editor.selectionClipboard,我能够断开 VSCode 中的中间按钮粘贴。我试图在 QtCreator 中找到类似的设置,但我不能。有没有办法在 QtCreator 中实现这一点?
我不想在整个系统范围内禁用这个中间按钮,因为这个功能对于在终端中粘贴代码/文本片段非常有用,在那里我不像在源代码编辑器中那样滚动。
我正在使用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数组而不复制数据将非常感激!
python ×7
numpy ×6
cython ×5
copy-paste ×1
import ×1
linux ×1
matplotlib ×1
memoryview ×1
mousewheel ×1
networkx ×1
opencv ×1
pickle ×1
qt-creator ×1
scipy ×1