当使用带有等高线图的matplotlib时,我无法按照我的意愿显示颜色条.我已经阅读了许多类似的例子,但仍未能得到我想要的东西.
在下图中,我想要改变两件事.我希望最小值和最大值显示在颜色条上(最大值应为2.0,最小值为-0.1).这两个值应位于颜色条的最边缘.另外,我希望colorbar在每次颜色转换时显示值.例如.在下图中,在2.1和1.8之间,还有另一个颜色过渡,其中不显示该值.
谁能帮帮我吗?我想我可能需要使用规范,但到目前为止它对我没用.
谢谢,

码:
import numpy as np
import matplotlib.pyplot as plt
xi = np.array([0., 0.5, 1.0])
yi = np.array([0., 0.5, 1.0])
zi = np.array([[0., 1.0, 2.0],
[0., 1.0, 2.0],
[-0.1, 1.0, 2.0]])
plt.contour(xi, yi, zi, 15, linewidths=0.5, colors='k')
plt.contourf(xi, yi, zi, 15, cmap=plt.cm.jet)
plt.colorbar()
plt.show()
Run Code Online (Sandbox Code Playgroud) 我能做些什么来加速numpy中的蒙面数组?我有一个非常低效的函数,我重新编写使用蒙版数组(我可以掩盖行,而不是像我一样屏蔽行而不是复制和删除行).但是,我惊讶地发现掩码函数慢了10倍,因为掩码数组的速度要慢得多.
举一个例子,采取以下(掩盖对我来说慢了6倍):
import timeit
import numpy as np
import numpy.ma as ma
def test(row):
return row[0] + row[1]
a = np.arange(1000).reshape(500, 2)
t = timeit.Timer('np.apply_along_axis(test, 1, a)','from __main__ import test, a, np')
print round(t.timeit(100), 6)
b = ma.array(a)
t = timeit.Timer('ma.apply_along_axis(test, 1, b)','from __main__ import test, b, ma')
print round(t.timeit(100), 6)
Run Code Online (Sandbox Code Playgroud) 这是我上一篇文章的后续问题:Python/Scipy Interpolation(map_coordinates)
假设我想在2d矩形区域上进行插值.我的变量'z'包含如下所示的数据.每列都是一个常量值,但是,数组的每一行可能处于不同的值,如下面的注释所示.
from scipy import interpolate
from numpy import array
import numpy as np
# # 0.0000, 0.1750, 0.8170, 1.0000
z = array([[-2.2818,-2.2818,-0.9309,-0.9309], # 0.0000, 0.0000, 0.0000, 0.0000
[-2.2818,-2.2818,-0.9309,-0.9309], # 0.2620, 0.2784, 0.3379, 0.3526
[-1.4891,-1.4891,-0.5531,-0.5531], # 0.6121, 0.6351, 0.7118, 0.7309
[-1.4891,-1.4891,-0.5531,-0.5531]]) # 1.0000, 1.0000, 1.0000, 1.0000
# Rows, Columns = z.shape
cols = array([0.0000, 0.1750, 0.8170, 1.0000])
rows = array([0.0000, 0.2620, 0.6121, 1.0000])
sp = interpolate.RectBivariateSpline(rows, cols, z, kx=1, ky=1, s=0)
xi = np.array([0.00000, 0.26200, 0.27840, 0.33790, 0.35260, …Run Code Online (Sandbox Code Playgroud) 我正在尝试用scipy做一些插值.我已经经历了很多例子,但我找不到我想要的东西.
假设我有一些数据,其中行和列变量可以在0到1之间变化.每行和每列之间的增量变化并不总是相同(见下文).
| 0.00 0.25 0.80 1.00
------|----------------------------
0.00 | 1.40 6.50 1.50 1.80
0.60 | 8.90 7.30 1.10 1.09
1.00 | 4.50 9.20 1.80 1.20
Run Code Online (Sandbox Code Playgroud)
现在我希望能够获取一组x,y点并确定插值.我知道我可以用map_coordinates做到这一点.我想知道是否有任何简单/巧妙的方法可以将x,y值设置为数据数组中的相应索引.
例如,如果我输入x,y = 0.60,0.25,那么我应该找回要插值的正确索引.在这种情况下,这将是1.0,1.0,因为0.60,0.25将精确映射到第二行和第二列.x = 0.3将映射到0.5,因为它介于0.00和0.60之间.
我知道如何得到我想要的结果,但我确信有一个非常快速/清晰的单行或双行(或已经存在的功能)可以做到这一点,使我的代码更清晰.基本上它需要在一些数组之间进行分段插值.
这是一个例子(很大程度上基于numpy数组上Scipy插值的代码) - 我将TODO放在这个新函数的位置:
from scipy.ndimage import map_coordinates
from numpy import arange
import numpy as np
# 0.000, 0.175, 0.817, 1.000
z = array([ [ 3.6, 6.5, 9.1, 11.5], # 0.0000
[ 3.9, -7.3, 10.0, 13.1], # 0.2620
[ 1.9, 8.3, -15.0, -12.1], # 0.6121
[-4.5, …Run Code Online (Sandbox Code Playgroud) 我可以使用什么正则表达式匹配".#,#." 在一个字符串中.它可能存在也可能不存在于字符串中.一些预期产出的例子可能是:
Test1.0,0.csv -> ('Test1', '0,0', 'csv') (Basic Example)
Test2.wma -> ('Test2', 'wma') (No Match)
Test3.1100,456.jpg -> ('Test3', '1100,456', 'jpg') (Basic with Large Number)
T.E.S.T.4.5,6.png -> ('T.E.S.T.4', '5,6', 'png') (Doesn't strip all periods)
Test5,7,8.sss -> ('Test5,7,8', 'sss') (No Match)
Test6.2,3,4.png -> ('Test6.2,3,4', 'png') (No Match, to many commas)
Test7.5,6.7,8.test -> ('Test7', '5,6', '7,8', 'test') (Double Match?)
Run Code Online (Sandbox Code Playgroud)
最后一个不太重要,我只期望.#,#.会出现一次.我正在处理的大多数文件,我希望落入第一到第四个例子,所以我最感兴趣的是那些.
谢谢您的帮助!
我想将2D数组保存到CSV文件中,该文件包含行和列"标题"信息(如表格).我知道我可以使用numpy.savetxt的头参数来保存列名,但有没有简单的方法来包含一些其他数组(或列表)作为第一列数据(如行标题)?
下面是我目前如何做的一个例子.有没有更好的方法来包含那些行标题,也许有一些技巧与savetxt我不知道?
import csv
import numpy as np
data = np.arange(12).reshape(3,4)
# Add a '' for the first column because the row titles go there...
cols = ['', 'col1', 'col2', 'col3', 'col4']
rows = ['row1', 'row2', 'row3']
with open('test.csv', 'wb') as f:
writer = csv.writer(f)
writer.writerow(cols)
for row_title, data_row in zip(rows, data):
writer.writerow([row_title] + data_row.tolist())
Run Code Online (Sandbox Code Playgroud) 我有一个脚本,我使用win32com与COM服务进行交互.程序已经打开时,它可以正常工作.我使用win32com.client.dynamic.Dispatch连接到它,然后与应该已经打开的文档进行交互.假设程序已经打开,我可以轻松检查文档是否打开,但我不确定如何检查程序是否已打开.当我使用上面提到的Dispatch时,它只是启动程序,如果它还没有打开,这不是我想要的.
我遇到了wxPython的问题.下面发布了代码的简化版本(删除了空格,注释等以减小大小 - 但我的程序的一般格式保持大致相同).当我运行脚本时,静态文本正确地包装,但面板中的其他项不会向下移动(它们就好像静态文本只有一行,因此并不是所有内容都可见).如果我手动调整窗口/框架的大小,即使只是很小的数量,一切都会得到纠正并按原样显示.我拍摄了屏幕截图来显示这种行为,但我刚创建了这个帐户,因此没有必要的10个声望点可以发布图片.
为什么开始时显示不正确?我尝试了GetParent().Refresh()或Update()和GetTopLevelParent().Update()或Refresh()的各种组合.我已经尝试了所有我能想到的但却无法在不手动调整框架/窗口大小的情况下正确显示它.一旦重新调整大小,它就会按照我的要求运行.
信息:
Windows XP
Python 2.5.2
wxPython 2.8.11.0(msw-unicode)
有什么建议?谢谢!
码:
#! /usr/bin/python
import wx
class StaticWrapText(wx.PyControl):
def __init__(self, parent, id=wx.ID_ANY, label='', pos=wx.DefaultPosition,
size=wx.DefaultSize, style=wx.NO_BORDER,
validator=wx.DefaultValidator, name='StaticWrapText'):
wx.PyControl.__init__(self, parent, id, pos, size, style, validator, name)
self.statictext = wx.StaticText(self, wx.ID_ANY, label, style=style)
self.wraplabel = label
#self.wrap()
def wrap(self):
self.Freeze()
self.statictext.SetLabel(self.wraplabel)
self.statictext.Wrap(self.GetSize().width)
self.Thaw()
def DoGetBestSize(self):
self.wrap()
#print self.statictext.GetSize()
self.SetSize(self.statictext.GetSize())
return self.GetSize()
class TestPanel(wx.Panel):
def __init__(self, *args, **kwargs):
# Init the base class
wx.Panel.__init__(self, *args, **kwargs)
self.createControls()
def createControls(self):
# --- …Run Code Online (Sandbox Code Playgroud) 我想知道是否有这样做的这种相反的简单(或者已经创建)的方式: 生成联用编号列表....此链接可用于执行以下操作:
>> list(hyphen_range('1-9,12,15-20,23'))
[1, 2, 3, 4, 5, 6, 7, 8, 9, 12, 15, 16, 17, 18, 19, 20, 23]:
Run Code Online (Sandbox Code Playgroud)
我想做相反的事情(请注意,包括10和21,因此它将与范围函数兼容,其中范围(1,10)= [1,2,3,4,5,6,7,8 ,9]):
>> list_to_ranges([1, 2, 3, 4, 5, 6, 7, 8, 9, 12, 15, 16, 17, 18, 19, 20, 23])
'1-10,12,15-21,23'
Run Code Online (Sandbox Code Playgroud)
最后,我想让输出还包含一个步骤,其中输出的最后一个数字表示步骤:
>> list_to_ranges([1, 3, 5, 7, 8, 9, 10, 11])
'1-13:2,8,10'
Run Code Online (Sandbox Code Playgroud)
从本质上讲,这最终会像"反向"范围函数
>> tmp = list_to_ranges([1, 3, 5])
>> print tmp
'1-7:2'
>> range(1, 7, 2)
[1, 3, 5]
Run Code Online (Sandbox Code Playgroud)
我的猜测是,没有真正简单/简单的方法可以做到这一点,但我想在我做一些蛮力,长方法之前我会问这里.
编辑
以这篇文章的答案中的代码为例,我想出了一个简单的方法来完成第一部分.但我认为确定执行步骤的模式会有点困难.
from itertools …Run Code Online (Sandbox Code Playgroud) 我正在尝试在MultiIndex列上使用查询。它适用于MultiIndex行,但不适用于该列。是否有一个原因?该文档显示的示例类似于下面的第一个示例,但并不表示它不适用于MultiIndex列。
我知道还有其他方法可以做到这一点,但是我正在专门尝试使用查询功能来做到这一点。
import numpy as np
import pandas as pd
df = pd.DataFrame(np.random.random((4,4)))
df.index = pd.MultiIndex.from_product([[1,2],['A','B']])
df.index.names = ['RowInd1', 'RowInd2']
# This works
print(df.query('RowInd2 in ["A"]'))
df = pd.DataFrame(np.random.random((4,4)))
df.columns = pd.MultiIndex.from_product([[1,2],['A','B']])
df.columns.names = ['ColInd1', 'ColInd2']
# query on index works, but not on the multiindexed column
print(df.query('index < 2'))
print(df.query('ColInd2 in ["A"]'))
Run Code Online (Sandbox Code Playgroud)