小编uho*_*hoh的帖子

为什么matplotlib需要在plt.scatter()之前设置日志比例而不是plt.plot()?

我在这个有用的答案中发现plt.scatter(),plt.plot()当在y轴上使用对数刻度时, 表现不同.

有了plot,我可以在使用之前随时更改为日志plt.show(),但必须在使用分散方法之前预先设置日志.

这只是matplotlib中的一个历史性且不可逆转的工件,还是属于"意外行为"类别?

在此输入图像描述

import matplotlib.pyplot as plt

X = [0.997, 2.643, 0.354, 0.075, 1.0, 0.03, 2.39, 0.364, 0.221, 0.437]
Y = [15.487507, 2.320735, 0.085742, 0.303032, 1.0, 0.025435, 4.436435,
     0.025435, 0.000503, 2.320735]

plt.figure()

plt.subplot(2,2,1)
plt.scatter(X, Y)
plt.xscale('log')
plt.yscale('log')
plt.title('scatter - scale last')   

plt.subplot(2,2,2)
plt.plot(X, Y)
plt.xscale('log')
plt.yscale('log')
plt.title('plot - scale last')   

plt.subplot(2,2,3)
plt.xscale('log')
plt.yscale('log')
plt.scatter(X, Y)
plt.title('scatter - scale first')   


plt.subplot(2,2,4)
plt.xscale('log')
plt.yscale('log')
plt.plot(X, Y)
plt.title('plot - scale …
Run Code Online (Sandbox Code Playgroud)

python matplotlib python-2.7

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

如果我想要随机非结构化数据的3D样条/平滑插值怎么办?

我由此受到启发答案通过@詹姆斯,看看如何griddatamap_coordinates可能被使用.在下面的例子中,我正在显示2D数据,但我的兴趣在于3D.我注意到griddata只提供1D和2D的样条曲线,并且仅限于3D和更高的线性插值(可能有很好的理由).然而,map_coordinates似乎很好用3D使用更高阶(比分段线性更平滑)插值.

我的主要问题是: 如果我在3D中有随机的非结构化数据(我不能使用map_coordinates),那么在NumPy SciPy宇宙中,或者至少在附近,是否有某种方法可以比分段线性插值更平滑?

我的第二个问题是:3D的样条是不可用的,griddata因为实现起来很困难或乏味,或者是否存在根本性的困难?

下面的图片和可怕的蟒蛇显示了我目前对griddata和map_coordinates如何使用或不能使用的理解.沿着粗黑线进行插值.

结构化数据:

结构化数据的插值

联合国结构化数据:

非结构化数据的插值

可怕的蟒蛇:

import numpy as np
import matplotlib.pyplot as plt

def g(x, y):
    return np.exp(-((x-1.0)**2 + (y-1.0)**2))

def findit(x, X):  # or could use some 1D interpolation
    fraction = (x - X[0]) / (X[-1]-X[0])
    return fraction * float(X.shape[0]-1)

nth, nr = 12, 11
theta_min, theta_max = 0.2, 1.3
r_min,     r_max     = 0.7, 2.0

theta = np.linspace(theta_min, theta_max, nth)
r     = np.linspace(r_min,     r_max, …
Run Code Online (Sandbox Code Playgroud)

python interpolation scipy

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

python logging.config 不可用?

Python 中良好日志实践教程,主模块查找logging.config但我的 python 2.7 安装没有显示,当我使用dir(logging)和尝试运行此示例时,我得到:

Traceback (most recent call last):
  File "/Users/your-name-here/logging python/example.py", line 7, in <module>
logging.config.fileConfig('logging.ini')
AttributeError: 'module' object has no attribute 'config'
Run Code Online (Sandbox Code Playgroud)

logging.config肯定会出现在一些文档中,所以这不是一个错误。为什么它没有出现在我的任何 python 2.7 安装中(当我输入dir(logging)包括去年的 anaconda时,我怎样才能让这个例子工作?

主要.py:

import logging

# load my module
import my_module

# load the logging configuration
logging.config.fileConfig('logging.ini')

my_module.foo()
bar = my_module.Bar()
bar.bar()
Run Code Online (Sandbox Code Playgroud)

my_module.py:

import logging

def foo():
    logger = logging.getLogger(__name__)
    logger.info('Hi, foo')

class Bar(object):
    def __init__(self, …
Run Code Online (Sandbox Code Playgroud)

python logging python-2.7

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

在另一个更大的数组中插入 3D 数组的值的最佳方法

必须有一些“Python化”的方式来做到这一点,但我不认为np.placenp.insert或者np.put是什么我要找的。我想A用较小的 3D 数组中的值替换大型 3D 数组中的值B,从[i,j,k]较大数组中的位置开始。看图:

我想输入类似A[i+, j+, k+] = Bnp.embed(B, A, (i,j,k)) 之类的内容,但当然这些都是不对的。

编辑:哦,有这个。所以我应该修改问题以询问这是否是最好的方法(其中“最佳”意味着笔记本电脑上 500x500x50 的浮点数组最快):

s0, s1, s2 = B.shape
A[i:i+s0, j:j+s1, k:k+s2] = B
Run Code Online (Sandbox Code Playgroud)

一个 3D 阵列在另一个里面

numpy array-broadcasting

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

Skyfield的地球形状似乎错了 - 我的python是否正确?

(lat, lon)使用Skyfield将地球中心的距离映射到不同的位置,显示了纬度的变化,但与经度(亚毫米)无关.这可能是包中记录的近似值,我的脚本中的错误或完全不同的东西.我在这里做错了吗?(当然,除了使用喷射)

你好

import numpy as np
import matplotlib.pyplot as plt
from skyfield.api import load, now

data  = load('de421.bsp')
earth = data['earth']
jd    = now()

epos = earth.at(jd).position.km

lats = np.linspace( -90,  90, 19)
lons = np.linspace(-180, 180, 37)
LATS, LONS = np.meshgrid(lats, lons)

s = LATS.shape

points = zip(LATS.flatten(), LONS.flatten())

rr = []
for point in points:
    la, lo = point
    pos = earth.topos(la, lo).at(jd).position.km
    r   = np.sqrt( ((pos-epos)**2).sum() )
    rr.append(r)

surf = np.array(rr).reshape(s)

extent …
Run Code Online (Sandbox Code Playgroud)

python numpy skyfield

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

将 matplotlib.rcParams 字典正确重置为其原始默认值

这个答案提到

fig = plt.figure()
fig.patch.set_facecolor('black')
Run Code Online (Sandbox Code Playgroud)

或者

plt.rcParams['figure.facecolor'] = 'black'
Run Code Online (Sandbox Code Playgroud)

将更改 rcParams 字典中键“figure.facecolor”的值。

假设我的脚本基于用户交互以不确定的方式对值进行了多次更改,并且我想撤消所有这些更改并返回到 matplotlib 的默认参数和行为。

在脚本的开头,我可以检查matplotlib.rcParams并存储整个字典或某些键的值,然后一次恢复一个或使用方法恢复它们.update(),但我不知道这是否明智,因为我不知道该实例还matplotlib.RcParams可以如何使用(它不仅仅是一个字典)。它确实有一个.setdefault()方法,但我不明白它会返回什么帮助:

Help on method setdefault in module collections.abc:

setdefault(key, default=None) method of matplotlib.RcParams instance
    D.setdefault(k[,d]) -> D.get(k,d), also set D[k]=d if k not in D
Run Code Online (Sandbox Code Playgroud)

是否有某种恢复原始默认值的功能,或者我应该通过使用我存储的副本更新整个内容来进行即兴发挥?

matplotlib python-3.x

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

获得叉积的最快方法

看起来显式计算向量数组的叉积比使用 快得多np.cross。我尝试过向量优先和向量最后,它似乎没有什么区别,尽管这是在类似问题的答案中提出的。是我用错了,还是速度慢了?

在笔记本电脑上,显式计算每个叉积大约需要 60 纳秒。这大概是最快的速度吗?在这种情况下,似乎还没有任何理由去使用 Cython 或 PyPy 或编写特别内容ufunc

我还看到了对 einsum 使用的引用,但我不太明白如何使用它,并且怀疑它不是更快。

a = np.random.random(size=300000).reshape(100000,3) # vector last
b = np.random.random(size=300000).reshape(100000,3)
c, d = a.swapaxes(0, 1),  b.swapaxes(0, 1)          # vector first

def npcross_vlast():        return np.cross(a, b)
def npcross_vfirst():       return np.cross(c, d, axisa=0, axisb=0)
def npcross_vfirst_axisc(): return np.cross(c, d, axisa=0, axisb=0, axisc=0)
def explicitcross_vlast():
    e = np.zeros_like(a)
    e[:,0] = a[:,1]*b[:,2] - a[:,2]*b[:,1]
    e[:,1] = a[:,2]*b[:,0] - a[:,0]*b[:,2]
    e[:,2] = a[:,0]*b[:,1] - a[:,1]*b[:,0]
    return e
def …
Run Code Online (Sandbox Code Playgroud)

numpy python-2.7 numpy-ufunc

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

如何在路径关闭时让SciPy.integrate.odeint停止?

下面的脚本集成了封闭路径周围的磁场线,并在使用Python中的Runge-Kutta RK4在某个容差范围内恢复到原始值时停止.我想用SciPy.integrate.odeint,但我看不出当路径近似关闭时我怎么能告诉它停止.

当然odeint可能比在Python中集成要快得多,我可以让它盲目地绕过并在结果中寻找结束,但在将来我会做更大的问题.

有没有办法可以实现" OK,足够接近 - 你现在可以停止! "方法进入odeint?或者我应该整合一段时间,检查,整合更多,检查......

这个讨论似乎很相关,似乎暗示"你不能从SciPy内部"可能是答案.

注意:我通常使用RK45(Runge-Kutta-Fehlberg),它在给定的行程尺寸下更准确,以加快速度,但我在这里保持简单.它还使可变步长成为可能.

更新:但有时我需要固定的步长.我发现它Scipy.integrate.ode确实提供了一种测试/停止方法,ode.solout(t, y)但似乎没有能力在固定点进行评估t.odeint允许在固定点进行评估t,但似乎没有测试/停止方法.

在此输入图像描述

def rk4Bds_stops(x, h, n, F, fclose=0.1):

    h_over_two, h_over_six = h/2.0, h/6.0

    watching = False
    distance_max = 0.0
    distance_old = -1.0

    i = 0

    while i < n and not (watching and greater):

        k1 = F( x[i]                )
        k2 = F( x[i] + k1*h_over_two)
        k3 = F( x[i] + k2*h_over_two)
        k4 = …
Run Code Online (Sandbox Code Playgroud)

python scipy odeint

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

需要更好地了解 rtol、atol 在 scipy.integrate.odeint 中如何工作

这里scipy.integrate.odeint用六个不同的标准颂歌问题来调用rtol= atolfrom 1E-06to 1E-13。我查看了所有较大公差的结果之间的最大差异减去最小公差的结果,以获得某种“错误”的表示。我很好奇为什么对于给定的容差,一个问题 (D5) 给出的错误比另一个问题 (C1) 严重一百万倍,即使步数范围相当窄(在 10 倍之内)。

脚本中给出了颂歌问题的引用。所有问题都相当正常化,所以我正在进行rtol类似的治疗atol

重申一下 - 我的问题是,为什么不同问题之间的误差几乎相差一个因子1E+06,尽管误差随容差而变化。当然,C1 是“最柔和的”,D5 在“近日点”处具有戏剧性的峰值,但我认为例程会在内部调整步长,以便误差相似。

编辑:我添加了“错误”的时间演变,这可能会带来一些启发。

屏幕截图问题

屏幕截图差异

屏幕截图结果

# FROM: "Comparing Numerical Methods for Ordinary Differential Equations"
# T.E. Hull, W.H. Enright, B.M. Fellen and A.E. Sedgwidh
# SIAM J. Numer. Anal. vol 9, no 4, December 1972, pp: 603-637

def deriv_B1(y, x):
    return [2.*(y[0]-y[0]*y[1]), -(y[1]-y[0]*y[1])] # "growth of two conflicting populations"

def deriv_B4(y, x):
    A = …
Run Code Online (Sandbox Code Playgroud)

python scipy ode

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

计算 Skyfield 中两个物体的表观角距的更好方法?

更新: Skyfield 刚刚进行了重大修订,包括扩展文档和角度分离方法 - 请参阅已接受的答案。

我正在使用Skyfield计算两个物体之间的表观角距。我没有在包中找到方法,所以我“发明”了一种通过计算两个视位置向量之间的点积的方法。

这是目前最好的方法吗?在Skyfield的范围内,它本质上是正确的吗?

def separation(seconds, lat, lon):

    lat, lon, seconds = float(lat), float(lon), float(seconds) # necessary it seems

    place = earth.topos(lat, lon)

    jd = JulianDate(utc=(2016, 3, 9, 0, 0, seconds))

    mpos = place.at(jd).observe(moon).apparent().position.km
    spos = place.at(jd).observe(sun).apparent().position.km

    mlen = np.sqrt((mpos**2).sum())
    slen = np.sqrt((spos**2).sum())

    sepa = ((3600.*180./np.pi) *
            np.arccos(np.dot(mpos, spos)/(mlen*slen)))

    return sepa


from skyfield.api import load, now, JulianDate
import numpy as np
from scipy.optimize import minimize

data = load('de421.bsp')

sun   = data['sun']
earth = data['earth']
moon  = …
Run Code Online (Sandbox Code Playgroud)

python skyfield

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