我在这个有用的答案中发现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) 我由此受到启发答案通过@詹姆斯,看看如何griddata
和map_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 中的良好日志实践教程中,主模块查找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化”的方式来做到这一点,但我不认为np.place
,np.insert
或者np.put
是什么我要找的。我想A
用较小的 3D 数组中的值替换大型 3D 数组中的值B
,从[i,j,k]
较大数组中的位置开始。看图:
我想输入类似A[i+, j+, k+] = B或np.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)
(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) 这个答案提到
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)
是否有某种恢复原始默认值的功能,或者我应该通过使用我存储的副本更新整个内容来进行即兴发挥?
看起来显式计算向量数组的叉积比使用 快得多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) 下面的脚本集成了封闭路径周围的磁场线,并在使用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) 这里scipy.integrate.odeint
用六个不同的标准颂歌问题来调用rtol
= atol
from 1E-06
to 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) 更新: 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 ×7
numpy ×3
python-2.7 ×3
scipy ×3
matplotlib ×2
skyfield ×2
logging ×1
numpy-ufunc ×1
ode ×1
odeint ×1
python-3.x ×1