小编mar*_*ako的帖子

仅使用 NumPy einsum 处理上三角元素

我正在使用 numpy einsum 计算形状为 (3,N) 的列向量 pts 数组与其自身的点积,从而产生形状为 (N,N) 的矩阵点积,以及所有点积。这是我使用的代码:

dotps = np.einsum('ij,ik->jk', pts, pts)
Run Code Online (Sandbox Code Playgroud)

这有效,但我只需要主对角线上方的值。IE。结果的上三角部分没有对角线。是否可以使用 einsum 仅计算这些值?或者以任何其他方式比使用 einsum 计算整个矩阵更快?

我的 pts 数组可能非常大,所以如果我只能计算我需要的值,那么我的计算速度就会加倍。

python numpy numpy-einsum

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

Matplotlib:如何在3D中有效地绘制大量线段?

我要用matplotlib绘制的每个点都有3d点和表面法线的列表。列表大小为千分之一。

我可以轻松地绘制点,但是在绘制线(以显示法线)时,我尝试了3种方法,但均未获得理想的结果。

第一种方法是按照问题的解决方案遍历每行。这可行,但是非常慢。

第二种方法似乎适用于2d图,是在给定图的x,y列表中隔行扫描“ Nones”。就像网站介绍的最后一种方法一样。但是,在3d中绘图时,这似乎不起作用。

我尝试过的第三种方法(对于2d效果很好)是使用LineCollection。但是,当我传递3d点时,它会引发异常,并抱怨“'顶点'必须是形状为Nx2的2D列表或数组”。因此,LineCollection似乎不支持3d。

有人知道如何使用matplotlib有效地绘制大量3d线段吗?

python matplotlib

3
推荐指数
1
解决办法
1275
查看次数

Cython C++包装器operator()重载错误

与我之前的问题相关联. 使用Cython包装一个使用OpenCV类型作为参数的C++类

现在我陷入了另一个错误.我的OpenCV类型Matx33d的cython包装代码如下所示:

cdef extern from "opencv2/core/core.hpp" namespace "cv":
    cdef cppclass Matx33d "cv::Matx<double, 3, 3>":
        Matx33d()
        Matx33d(double v0, double v1, double v2, double v3, double v4, double v5, double v6, double v7, double v8)
        double& operator()(int i, int j)
Run Code Online (Sandbox Code Playgroud)

然后我定义了一个函数来将Matx33d复制到一个numpy数组.

cdef Matx33d2numpy(Matx33d &m):
    cdef np.ndarray[np.double_t, ndim=2] np_m = np.empty((3,3), dtype=np.float64)  
    np_m[0,0]= m(0,0); np_m[0,1]= m(0,1); np_m[0,2]= m(0,2)
    np_m[1,0]= m(1,0); np_m[1,1]= m(1,1); np_m[1,2]= m(1,2)
    np_m[2,0]= m(2,0); np_m[2,1]= m(2,1); np_m[2,2]= m(2,2)    
    return np_m
Run Code Online (Sandbox Code Playgroud)

当我编译cython包装器时,我得到了这些错误

geom_gateway.cpp(2528) error C3861: '()': identifier not found
Run Code Online (Sandbox Code Playgroud)

这对应于第一次使用Matx33d :: …

c++ python opencv cython

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

使用Cython包装使用OpenCV类型作为参数的C ++类

我正在尝试使用Cython包装使用某些OpenCV类型作为参数的C ++类,然后打算从Python使用此包装的类。C ++类的简化版本如下所示:

“ transform.h”

#include "opencv2/core/core.hpp"

namespace geom
{
    class Transform
    {
    public:
        Transform(cv::Vec3d &euler, cv::Vec3d &t);
        void set_euler(cv::Vec3d &euler);
        cv::Vec3d get_euler();
    }
}
Run Code Online (Sandbox Code Playgroud)

Vec3d在OpenCV中定义为:

template<typename _Tp, int n> class Vec : public Matx<_Tp, n, 1> {...};
typedef Vec<double, 3> Vec3d;
Run Code Online (Sandbox Code Playgroud)

Matx定义为:

template<typename _Tp, int m, int n> class Matx {...};
Run Code Online (Sandbox Code Playgroud)

我对cython包装器的第一次尝试是这样的:

“ geom_gateway.pyx”

cdef extern from "opencv2/core/core.hpp" namespace "cv":
    cdef cppclass Matx[_Tp, int m, int n]:
        Matx()
        Matx(_Tp v0, _Tp v1, _Tp v2)

cdef extern from "opencv2/core/core.hpp" namespace …
Run Code Online (Sandbox Code Playgroud)

c++ python opencv cython

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

标签 统计

python ×4

c++ ×2

cython ×2

opencv ×2

matplotlib ×1

numpy ×1

numpy-einsum ×1