使用解释器时,表达式'a' in ('abc')返回True,而'a' in ['abc']返回False.有人可以解释这种行为吗?
假设我有这个产生线程的类:
import threading
class SomeClass(threading.Thread):
def __init__(self):
threading.Thread.__init__(self)
def run(self):
while True:
pass
def doSomething(self):
pass
def doSomethingElse(self):
pass
Run Code Online (Sandbox Code Playgroud)
我想要
someClass = SomeClass()
someClass.start()
someClass.doSomething()
someClass.doSomethingElse()
someClass.doSomething()
Run Code Online (Sandbox Code Playgroud)
我怎样才能做到这一点?我知道我可以在函数内部调用一个函数run(),但这不是我的目标.
HEJ,
我想从matplotlib图中生成高质量的PDF.使用其他代码,我生成了一大堆数字,我使用plt.imshow绘制在图中.如果我现在使用plt.savefig生成PDF,我会发现很大的差异取决于我使用的后端.最重要的是,使用Agg或MacOSX后端生成的文件变得非常庞大,而开罗的文件相当小(参见下面的示例).另一方面,Cairo后端与标签的TeX渲染一起产生奇怪的文本.这在TeX文档中看起来很糟糕.因此我的问题是双重的:
以下是一些用于测试目的的示例代码:
import matplotlib as mpl
mpl.use( "cairo" )
import numpy as np
import matplotlib.pyplot as plt
plt.rcParams['text.usetex'] = True
data = np.random.rand( 50, 50 )
plt.imshow( data, interpolation='nearest' )
plt.xlabel( 'X Label' )
plt.savefig( 'cairo.pdf' )
Run Code Online (Sandbox Code Playgroud)
产生15Kb的PDF,看起来很糟糕的xlabel.
import matplotlib as mpl
mpl.use( "agg" )
import numpy as np
import matplotlib.pyplot as plt
plt.rcParams['text.usetex'] = True
data = np.random.rand( 50, 50 )
plt.imshow( data, interpolation='nearest' )
plt.xlabel( 'X Label' )
plt.savefig( 'agg.pdf' )
Run Code Online (Sandbox Code Playgroud)
生成986Kb的PDF,看起来不错.
我应该补充一点,我在OSX 10.6.8上使用matplotlib 1.0.1和python …
在C#中,字符串被实现.也就是说,如果我创建字符串foobar并再次使用它,C#将只在内存中有一个字符串实例,虽然我将有两个引用,但它们都将指向同一个字符串实例.这就是为什么字符串必须在C#中不可变的一个原因.
现在,我的问题是,是否有可能以某种方式创建两个相同的字符串,以便它们不被实现,但我们最终在内存中有两个不同的字符串实例,有两个不同的地址,包含相同的文本?
如果是这样,怎么样?
而且,这是不是偶然发生的事情,或者您是否需要为此案例明确构建场景?
并且,最后:假设在内存中有两个单独的字符串实例具有相同的值,它们是否相等(就其而言==)?如果是这样,怎么==工作?首先通过参考比较,然后按值,或......?
与此问题相关,我想要一个每个点都有规定颜色的3D散点图.问题中发布的示例适用于我的系统,但在第一次重绘后(例如保存后或旋转图像时)颜色似乎丢失,即所有点都以蓝色绘制,并带有通常的深度信息.请参阅下面的修改示例.
我的系统是Python 2.6.7,在mac 10.8.0上从macports安装了matplotlib 1.1.0.我使用MacOSX后端.
有谁知道如何规避这个问题?
import numpy as np
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
# Create Map
cm = plt.get_cmap("RdYlGn")
x = np.random.rand(30)
y = np.random.rand(30)
z = np.random.rand(30)
col = np.arange(30)
fig = plt.figure()
ax3D = fig.add_subplot(111, projection='3d')
ax3D.scatter(x, y, z, s=30, c=col, marker='o', cmap=cm)
plt.savefig('image1.png')
plt.savefig('image2.png')
Run Code Online (Sandbox Code Playgroud)
这是两个图像,我得到:

在python中实现多处理的一种简单方法是
from multiprocessing import Pool
def calculate(number):
return number
if __name__ == '__main__':
pool = Pool()
result = pool.map(calculate, range(4))
Run Code Online (Sandbox Code Playgroud)
基于期货的另一种实现方式是
from concurrent.futures import ProcessPoolExecutor
def calculate(number):
return number
with ProcessPoolExecutor() as executor:
result = executor.map(calculate, range(4))
Run Code Online (Sandbox Code Playgroud)
两种替代方案基本上都是相同的,但一个显着的区别是我们不必使用通常的if __name__ == '__main__'条款来保护代码.这是因为期货的实施照顾了这个还是我们有不同的原因?
更广泛地说,multiprocessing和之间有什么区别concurrent.futures?什么时候优先于另一个?
编辑:我最初假设防护if __name__ == '__main__'只是多处理所必需的是错误的.显然,对于Windows上的两种实现都需要这种保护,而在unix系统上则没有必要.
我开发了一个python程序,可以进行繁重的数值计算.我在具有32个Xeon CPU,64GB RAM和64位Ubuntu 14.04的Linux机器上运行它.我并行启动具有不同模型参数的多个python实例以使用多个进程,而不必担心全局解释器锁(GIL).当我使用监视cpu利用率时htop,我看到所有核心都被使用,但大部分时间都是由内核使用的.通常,内核时间是用户时间的两倍以上.我担心系统级别会有很多开销,但我无法找到原因.
如何降低高内核CPU使用率?
以下是我做的一些观察:
sys.setcheckinterval(10000)(对于python2)和sys.setswitchinterval(10)(对于python3)增加python时间片,但这没有一个帮助schedtool -B PID但这没有帮助编辑:
以下是截图htop:

我也跑了perf record -a -g,这是报告perf report -g graph:
Samples: 1M of event 'cycles', Event count (approx.): 1114297095227
- 95.25% python3 [kernel.kallsyms] [k] _raw_spin_lock_irqsave ?
- _raw_spin_lock_irqsave ?
- 95.01% extract_buf ?
extract_entropy_user ?
urandom_read ?
vfs_read ?
sys_read ?
system_call_fastpath ?
__GI___libc_read ?
- 2.06% …Run Code Online (Sandbox Code Playgroud) 我使用matplotlib的symlog标度来覆盖向正方向和负方向延伸的大范围参数.不幸的是,symlog规模不是很直观,也可能不常用.因此,我想通过在主要刻度之间放置小刻度来使用过的缩放更明显.在比例的日志部分,我想在[2,3,...,9]*10 ^ e处放置蜱,其中e是附近的主要蜱.此外,0到0.1之间的范围应覆盖均匀放置的次要刻度,相隔0.01.我尝试使用matplotlib.ticker API使用以下代码获得此类滴答:
import numpy as np
import matplotlib.pyplot as plt
from matplotlib.ticker import LogLocator, AutoLocator
x = np.linspace(-5, 5, 100)
y = x
plt.plot(x, y)
plt.yscale('symlog', linthreshy=1e-1)
yaxis = plt.gca().yaxis
yaxis.set_minor_locator(LogLocator(subs=np.arange(2, 10)))
plt.show()
Run Code Online (Sandbox Code Playgroud)
不幸的是,这不会产生我想要的东西:

请注意,在0附近有许多小的刻度,这可能是由于LogLocator.此外,负轴上没有小的刻度.
如果我使用而AutoLocator不是出现轻微的刻度.该AutoMinorLocator不会只支持按比例均匀轴.我的问题是如何实现所需的刻度位置?
我想创建一个 numba 编译的 python 可调用(一个我可以在另一个 Numba 编译的函数中使用的函数),它有一个内部数组,我可以调整它来影响函数调用的结果。在纯 python 中,这将对应于具有__call__方法的类:
class Test:
def __init__(self, arr):
self.arr = arr
def __call__(self, idx):
res = 0
for i in idx:
res += self.arr[i]
return res
t = Test([0, 1, 2])
print(t([1, 2]))
t.arr = [1, 2, 3]
print(t([1, 2]))
Run Code Online (Sandbox Code Playgroud)
分别打印3和5,所以修改内部数组后结果不同arr。
Numba usingjitclass和 numpy 数组的字面翻译如下所示
import numpy as np
import numba as nb
@nb.jitclass([('arr', nb.double[:])])
class Test:
def __init__(self, arr):
self.arr = arr.astype(np.double)
def …Run Code Online (Sandbox Code Playgroud) 我尝试label=None在 plot 命令中使用,在这种情况下,matplotlib选择数据的键作为标签。我发现这种行为不直观,并希望在我明确设置标签时完全控制它。如何禁用涉及数据pandas框中数据的绘图标签?
这是一个小例子,它显示了行为:
import matplotlib.pyplot as plt
import pandas as pd
df = pd.DataFrame({'x': [0, 1], 'y': [0, 1]})
plt.plot(df['x'], df['y'], label=None)
plt.legend(loc='best')
Run Code Online (Sandbox Code Playgroud)
这导致以下情节:
如果重要,我目前在从 macports 安装的以下 python 中使用 matplotlib 版本 1.5.1 和 Pandas 版本 0.18.0:Python 2.7.11(默认,2016 年 3 月 1 日,18:40:10)[GCC 4.2。 1 在达尔文上兼容 Apple LLVM 7.0.2 (clang-700.1.81)]
我正在使用Python.如何基于具有相同长度的两个其他向量的值来进行向量的子选择?
例如这三个向量
c1 = np.array([1,9,3,5])
c2 = np.array([2,2,3,2])
c3 = np.array([2,3,2,3])
c2==2
array([ True, True, False, True], dtype=bool)
c3==3
array([False, True, False, True], dtype=bool)
Run Code Online (Sandbox Code Playgroud)
我想做这样的事情:
elem = (c2==2 and c3==3)
c1sel = c1[elem]
Run Code Online (Sandbox Code Playgroud)
但第一个语句导致错误:
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ValueError: The truth value of an array with more than one element is ambiguous.
Use a.any() or a.all()
Run Code Online (Sandbox Code Playgroud)
在Matlab中,我会使用:
elem = find(c2==2 & c3==3);
c1sel = c1(elem);
Run Code Online (Sandbox Code Playgroud)
如何在Python中执行此操作?
我想创建一个 Numba 编译的函数,它将指针或数组的内存地址作为参数并对其进行计算,例如修改基础数据。
用于说明这一点的纯 python 版本如下所示:
import ctypes
import numba as nb
import numpy as np
arr = np.arange(5).astype(np.double) # create arbitrary numpy array
def modify_data(addr):
""" a function taking the memory address of an array to modify it """
ptr = ctypes.c_void_p(addr)
data = nb.carray(ptr, arr.shape, dtype=arr.dtype)
data += 2
addr = arr.ctypes.data
modify_data(addr)
arr
# >>> array([2., 3., 4., 5., 6.])
Run Code Online (Sandbox Code Playgroud)
正如您在示例中看到的,数组arr已被修改,但未将其显式传递给函数。在我的用例中,数组的形状和数据类型是已知的,并且始终保持不变,这应该简化界面。
我现在尝试编译该modify_data函数,但失败了。我的第一次尝试是使用
shape = arr.shape
dtype = arr.dtype
@nb.njit
def modify_data_nb(ptr):
data …Run Code Online (Sandbox Code Playgroud) 我在python中编写了一个相对简单的函数,可用于绘制数据集的时域历史以及快速傅立叶变换后数据集的频域响应.在此函数中,我使用该命令from pylab import *引入所有必要的功能.然而,尽管成功创建了情节,但我得到了警告
import*仅允许在模块级别.
因此,如果使用该命令from pylab import *不是首选方法,我如何从pylab正确加载所有必要的功能.代码附在下面.此外,有没有办法在退出函数后关闭图形,我已经尝试过plt.close()哪些不能识别子图?
def Time_Domain_Plot(Directory,Title,X_Label,Y_Label,X_Data,Y_Data):
# Directory: The path length to the directory where the output file is
# to be stored
# Title: The name of the output plot, which should end with .eps or .png
# X_Label: The X axis label
# Y_Label: The Y axis label
# X_Data: X axis data points (usually time at which Yaxis data was acquired
# Y_Data: Y axis data …Run Code Online (Sandbox Code Playgroud) python ×12
matplotlib ×5
numba ×2
numpy ×2
python-2.7 ×2
arrays ×1
backend ×1
c# ×1
linux ×1
pandas ×1
pdf ×1
performance ×1
string ×1
subset ×1