小编Mat*_*ock的帖子

Delaunay使用python从3D表面进行三维点的三角测量?

我有一个3D点集合.这些点以恒定水平(z = 0,1,...,7)进行采样.图像应该清楚:

点集合

这些点是一个(N, 3)叫做numpar形状的ndarray X.上面的图使用以下方式创建:

import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D

X = load('points.npy')
fig = plt.figure()
ax = fig.gca(projection='3d')
ax.plot_wireframe(X[:,0], X[:,1], X[:,2])
ax.scatter(X[:,0], X[:,1], X[:,2])
plt.draw()
Run Code Online (Sandbox Code Playgroud)

我想改为仅对该物体的表面进行三角测量,并绘制曲面.但是,我不想要这个物体的凸包,因为这会丢失我希望能够检查的细微形状信息.

我试过了ax.plot_trisurf(X[:,0], X[:,1], X[:,2]),但这导致了下面的混乱:

食堂

有帮助吗?

示例数据

以下是生成代表问题的3D数据的代码段:

import numpy as np
X = []
for i in range(8):
    t = np.linspace(0,2*np.pi,np.random.randint(30,50))
    for j in range(t.shape[0]):
        # random circular objects...
        X.append([
            (-0.05*(i-3.5)**2+1)*np.cos(t[j])+0.1*np.random.rand()-0.05,
            (-0.05*(i-3.5)**2+1)*np.sin(t[j])+0.1*np.random.rand()-0.05,
            i
        ])
X = np.array(X)
Run Code Online (Sandbox Code Playgroud)

来自原始图像的示例数据

这是原始数据的pastebin:

http://pastebin.com/YBZhJcsV

这是沿着常数z的切片:

这里不输入图像描述

python numpy data-visualization matplotlib

21
推荐指数
2
解决办法
9533
查看次数

如何在更改期间使用jquery获取输入范围?

我在Chrome 41中使用jQuery 2.1.我需要从输入滑块中获取值,因为它会发生变化; 但是,当我使用jquery的change事件时,我只在鼠标释放后从滑块中获取值,而不是在mousedown和drag中.

这个小例子说明了这个问题:

<input type="range" id="slider" value="0.5" min="0.0" max="1.0" step="0.01" />

<br />

<span id="slider_value">Nothing yet.</span>

<script>
$(document).on('change', '#slider', function() {
    $('#slider_value').html( $(this).val() );
});
</script>
Run Code Online (Sandbox Code Playgroud)

我想我可以通过在鼠标上/下事件上设置布尔值然后获取mousemove事件的值来提出修复.有更清洁的解决方案吗?

jquery

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

将matplotlib矩形边设置为指定宽度的外部?

有没有办法为matplotlib的Rectangle补丁指定边缘,以便边界在指定的域之外?例如,在photoshop中,这将被称为"笔画位置".请允许我举例说明:

import numpy as np
import matplotlib.pyplot as plt
from matplotlib.patches import Rectangle


# Here's my "image"
X = np.arange(16).reshape(4,4)

# Suppose I want to highlight some feature in the middle boxes.
fig = plt.figure()
ax = fig.add_subplot(111)
ax.imshow(X, cmap=plt.cm.gray, interpolation='nearest')
ax.add_patch( Rectangle((0.5, 0.5), 2, 2, fc='none', ec='r') )
plt.show()
Run Code Online (Sandbox Code Playgroud)

这产生以下结果:

在此输入图像描述

但是,如果修改如下

ax.add_patch( Rectangle((0.5, 0.5), 2, 2, fc='none', ec='r', lw=10) )
Run Code Online (Sandbox Code Playgroud)

我得到了这个数字:

在此输入图像描述

如您所见,边缘位于Rectangle对象域边界的中心位置,因此会渗入此域.是否可以强制边缘边界严格位于Rectangle域之外?

python matplotlib

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

正确的方式指向ATLAS/BLAS/LAPACK库进行numpy构建?

我在CentOS 6.5上从源代码构建numpy,没有root访问权限(python -V = 2.7.6).我有来自git的最新numpy源代码.我不能因为我的生活而得到numpy承认atlas libs.我有:

ls -1 /usr/lib64/atlas

libatlas.so.3
libatlas.so.3.0
libcblas.so.3
libcblas.so.3.0
libclapack.so.3
libclapack.so.3.0
libf77blas.so.3
libf77blas.so.3.0
liblapack.so.3
liblapack.so.3.0
libptcblas.so.3
libptcblas.so.3.0
libptf77blas.so.3
libptf77blas.so.3.0
Run Code Online (Sandbox Code Playgroud)

我不知道这些lib是如何产生的,但我只能假设atlas版本比我可以制作的任何标准BLAS/LAPACK版本更快.

将numpy指向这些库的正确方法是什么?我是否export ATLAS, BLAS, LAPACK=...将每个设置为相应的路径?或者我编辑site.cfg文件以包含以下内容:

[default]
library_dirs = /usr/lib64/atlas

[atlas]
library_dirs = /usr/lib64/atlas
atlas_libs = lapack, cblas, f77blas, atlas
Run Code Online (Sandbox Code Playgroud)

我已经尝试了上面的每一个变体,每次运行python setup.py config它都告诉我在我指定的路径中找不到每个库以及一堆其他默认搜索路径.我已经python setup.py config使用site.cfg上面的设置粘贴了运行结果,并且没有设置环境变量:http://pastebin.com/EL9CfaR7.任何帮助表示赞赏.

numpy blas lapack atlas

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

为什么使用物流sigmoid的tanh定义比scipy的expit更快?

我正在为应用程序使用逻辑sigmoid.我比较了使用scipy.special函数的时间expit,而不是使用S形的双曲正切定义.

我发现双曲正切是快3倍.这里发生了什么?我还在排序的数组上测试了时间,看看结果是否有任何不同.

以下是在IPython中运行的示例:

In [1]: from scipy.special import expit

In [2]: myexpit = lambda x: 0.5*tanh(0.5*x) + 0.5

In [3]: x = randn(100000)

In [4]: allclose(expit(x), myexpit(x))
Out[4]: True

In [5]: timeit expit(x)
100 loops, best of 3: 15.2 ms per loop

In [6]: timeit myexpit(x)
100 loops, best of 3: 4.94 ms per loop

In [7]: y = sort(x)

In [8]: timeit expit(y)
100 loops, best of 3: 15.3 ms per loop

In [9]: timeit …
Run Code Online (Sandbox Code Playgroud)

python numpy scipy

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

使用 pint 获取特定维度的所有单位

使用pintpint.UnitRegistry ,如何按维度过滤单位?例如,如何获得质量类型或体积类型的所有单位?

python units-of-measurement

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

正确使用scipy.interpolate.RegularGridInterpolator

对scipy.interpolate.RegularGridInterpolator文档感到有点困惑.

比方说我有一个函数f:R ^ 3 => R,它是在单位立方体的顶点上采样的.我想插值以便在立方体内找到值.

import numpy as np

# Grid points / sample locations
X = np.array([[0,0,0], [0,0,1], [0,1,0], [0,1,1], [1,0,0], [1,0,1], [1,1,0], [1,1,1.]])

# Function values at the grid points
F = np.random.rand(8)
Run Code Online (Sandbox Code Playgroud)

现在,RegularGridInterpolator采取一个points论点和一个values论点.

points:float的ndarray元组,带有形状(m1,),...,(mn,)n个维度中定义规则网格的点.

values:array_like,shape(m1,...,mn,...)n维中规则网格上的数据.

我将此解释为可以这样调用:

import scipy.interpolate as irp

rgi = irp.RegularGridInterpolator(X, F)
Run Code Online (Sandbox Code Playgroud)

但是,当我这样做时,我收到以下错误:

ValueError:有8个点数组,但值有1个维度

我在文档中误解了什么?

python interpolation numpy scipy

4
推荐指数
2
解决办法
6683
查看次数

模块化 peee

假设我有几个简单的模型位于food.py

import peewee as pw

db = pw.SqliteDatabase('food.db')

class BaseModel(pw.Model):
    class Meta:
        database = db

class Taco(BaseModel):
    has_cheese = pw.BooleanField()

class Spaghetti(BaseModel):
    has_meatballs = pw.BooleanField()

db.connect()

# populate with some data if table doesn't exist
from random import random
if not Taco.table_exists():
    db.create_table(Taco)
    for _ in range(10):
        Taco.create( has_cheese = (random() < 0.5) )
    db.commit()
if not Spaghetti.table_exists():
    db.create_table(Spaghetti)
    for _ in range(10):
        Spaghetti.create( has_meatballs = (random() < 0.5) )
    db.commit()
Run Code Online (Sandbox Code Playgroud)

后来,我有了food.pyfood.db。但是假设Taco和 …

python python-module peewee

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

获取 group by 语句 sqlite 中每个组的 id 列表

假设我有一个如下所示的 sqlite 表:

CREATE TABLE my_table (
    id INTEGER PRIMARY KEY,
    field1 INTEGER,
    field2 INTEGER
);

INSERT INTO my_table (field1, field2) VALUES
    (1, 2),
    (2, 1),
    (2, 1),
    (3, 1),
    (1, 2),
    (2, 1);
Run Code Online (Sandbox Code Playgroud)

看起来像:

1|1|2
2|2|1
3|2|1
4|3|1
5|1|2
6|2|1
Run Code Online (Sandbox Code Playgroud)

对于组大小大于 1 的每组不同值,我想要一组相应的 id。对于上述情况,这将是:1,52,3,6

如果我跑

SELECT id FROM my_table
GROUP BY
    field1, field2
HAVING count(*) > 1;
Run Code Online (Sandbox Code Playgroud)

只返回每个组的最后一个,即56。我可以返回每个组的所有ID 吗?

sql sqlite

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

如何在 matplotlib 中使用 Humor Sans?

我想使用 matploblib 创建 XKCD 风格的 ROC 曲线图。它大部分工作正常,但我不明白为什么它不使用幽默。它肯定安装在我的系统上:

$ fc-list | grep -i humor
/home/user/.local/share/fonts/Humor-Sans.ttf: Humor Sans:style=Regular
Run Code Online (Sandbox Code Playgroud)

如何让 matplotlib 使用 Humor-Sans 字体?

我已经尝试添加fontname='Humor Sans'

/home/user/.local/lib/python3.6/site-packages/matplotlib/font_manager.py:1328:
UserWarning: findfont: Font family ['Humor Sans'] not found.
Falling back to DejaVu Sans
Run Code Online (Sandbox Code Playgroud)

我的代码

import matplotlib.pyplot as plt
import numpy as np

with plt.xkcd():
    xs = np.linspace(0, 1, 50)
    plt.plot(xs, (1 / (-xs) + 50) / 50)
    plt.plot(xs, xs)
    plt.title('ROC Curve')
    plt.xlabel('False Positive Rate')
    plt.ylabel('True Positive Rate')
    plt.savefig('xkcd-roc-explanation.png')
Run Code Online (Sandbox Code Playgroud)

当前结果

在此输入图像描述

python matplotlib ubuntu-18.04

4
推荐指数
2
解决办法
2433
查看次数

传递布尔数组而不使用`f2py`进行复制?

如果我打算将一个布尔值 NumPy 数组传递给 Fortran 变量,应该如何输入它们f2py?我已经尝试了integer*1logical*1,但是这两个都表明该数组已被复制。

例如,如果我编译文件foo.f95,包含:

subroutine foo(x, n)
    logical*1 x(n)
    !f2py intent(in) x
    !f2py intent(hide), depend(x) :: n=shape(x,0)
    ...
end subroutine
Run Code Online (Sandbox Code Playgroud)

使用f2py -c -m foo foo.f90 -DF2PY_REPORT_ON_ARRAY_COPY=1并运行以下内容:

import numpy as np
import foo
x = np.random.randn(100) < 0
foo.foo(x)
Run Code Online (Sandbox Code Playgroud)

它打印

copied an array: size=100, elsize=1
Run Code Online (Sandbox Code Playgroud)

如果我更改logical*1integer*1. Fortran 文件中布尔数组的正确类型是什么,以便不复制数组?

请注意,这不是内存连续性的问题,因为数组是一维的——foo.foo(np.asfortranarray(x))打印相同的复制消息。

python fortran numpy f2py

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

在NumPy中沿3D阵列的每个轴应用DFT矩阵?

我可以先获得给定大小的DFT矩阵,表示n通过

import numpy as np
n = 64
D = np.fft.fft(np.eye(n))
Run Code Online (Sandbox Code Playgroud)

FFT当然只是应用于D矢量的快速算法:

x = np.random.randn(n)
ft1 = np.dot(D,x)
print( np.abs(ft1 - fft.fft(x)).max() )
# prints near double precision roundoff
Run Code Online (Sandbox Code Playgroud)

可以通过应用D矩阵的行和列来获得2D FFT :

x = np.random.randn(n,n)
ft2 = np.dot(x, D.T) # Apply D to rows.
ft2 = np.dot(D, ft2) # Apply D to cols.
print( np.abs(ft2 - fft.fft2(x)).max() )
# near machine round off again
Run Code Online (Sandbox Code Playgroud)

我如何类似地计算三维离散傅立叶变换?

也就是说,

x = np.random.randn(n,n,n)
ft3 = # dot operations …
Run Code Online (Sandbox Code Playgroud)

python numpy

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