我有两个2d numpy数组:x_array包含x方向的位置信息,y_array包含y方向的位置.
然后我有一长串x,y点.
对于列表中的每个点,我需要找到最接近该点的位置(在数组中指定)的数组索引.
基于这个问题,我天真地产生了一些有效的代码: 在numpy数组中查找最接近的值
即
import time
import numpy
def find_index_of_nearest_xy(y_array, x_array, y_point, x_point):
distance = (y_array-y_point)**2 + (x_array-x_point)**2
idy,idx = numpy.where(distance==distance.min())
return idy[0],idx[0]
def do_all(y_array, x_array, points):
store = []
for i in xrange(points.shape[1]):
store.append(find_index_of_nearest_xy(y_array,x_array,points[0,i],points[1,i]))
return store
# Create some dummy data
y_array = numpy.random.random(10000).reshape(100,100)
x_array = numpy.random.random(10000).reshape(100,100)
points = numpy.random.random(10000).reshape(2,5000)
# Time how long it takes to run
start = time.time()
results = do_all(y_array, x_array, points)
end = time.time()
print 'Completed in: ',end-start
Run Code Online (Sandbox Code Playgroud)
我在一个大型数据集上做这个,并且真的想加快一点.谁能优化这个?
谢谢.
更新:解决方案遵循@silvado和@justin的建议(下) …
我在Python中使用2D Numpy masked_array.我需要更改屏蔽区域中的数据值,使它们等于最近的未屏蔽值.
NB.如果有多个最接近的未屏蔽值,那么它可以采用任何那些最接近的值(其中一个最简单的代码......)
例如
import numpy
import numpy.ma as ma
a = numpy.arange(100).reshape(10,10)
fill_value=-99
a[2:4,3:8] = fill_value
a[8,8] = fill_value
a = ma.masked_array(a,a==fill_value)
>>> a [[0 1 2 3 4 5 6 7 8 9]
[10 11 12 13 14 15 16 17 18 19]
[20 21 22 -- -- -- -- -- 28 29]
[30 31 32 -- -- -- -- -- 38 39]
[40 41 42 43 44 45 46 47 48 49]
[50 51 52 53 …Run Code Online (Sandbox Code Playgroud) 我想使用MPI_Iprobe来测试具有给定标记的消息是否已经挂起.
但是,MPI_Iprobe的行为并不像我预期的那样.在下面的示例中,我将来自多个任务的消息发送到单个任务(等级0).然后在0级,我等待几秒钟,以便有足够的时间让MPI_Isends完成.然后当我运行MPI_Iprobe时,它返回标志为false.如果我在(阻塞)MPI_Probe之后重复,则返回true.
#include "mpi.h"
#include <stdio.h>
#include <unistd.h>
int main(int argc, char *argv[])
{
int rank;
int numprocs;
int tag;
int receive_tag;
int flag=0;
int number;
int recv_number=0;
MPI_Request request;
MPI_Status status;
MPI_Init(&argc,&argv);
MPI_Comm_rank(MPI_COMM_WORLD,&rank);
MPI_Comm_size(MPI_COMM_WORLD,&numprocs);
// rank 0 receives messages, all others send messages
if (rank > 0 ) {
number = rank;
tag = rank;
MPI_Isend(&number, 1, MPI_INT, 0, tag, MPI_COMM_WORLD,&request); // send to rank 0
printf("Sending tag : %d \n",tag);
}
else if (rank == 0) {
sleep(5); …Run Code Online (Sandbox Code Playgroud) 我正在开发一个包含大型科学数据集的数据库.典型的使用场景是每天将大约5GB的新数据写入数据库; 每天也会删除5GB.总数据库大小约为50GB.我正在运行的服务器将无法将整个数据集存储在内存中.
我构建了数据库,使得主数据表只是一个由唯一ID和值组成的键/值存储.
查询通常是大约100个连续值,例如. SELECT Value WHERE ID BETWEEN 7000000 AND 7000100;
我目前正在使用MySQL/MyISAM,这些查询的大小为0.1 - 0.3秒,但最近我发现MySQL可能不是基本上是大型键/值存储的最佳解决方案.
在我开始安装新软件和重写整个数据库的大量工作之前,我想大致了解在使用NoSQL DB(例如Tokyo Tyrant,Cassandra,MongoDB)时是否有可能看到显着的性能提升MySQL用于这些类型的检索.
谢谢
在Python中,我有一个字符串,它是逗号分隔的值列表.例如'5,2,7,8,3,4'
我需要在末尾添加一个新值并删除第一个值,
例如'5,22,7,814,3,4' - > '22,7,814,3,4,1'
目前,我这样做如下:
mystr = '5,22,7,814,3,4'
latestValue='1'
mylist = mystr.split(',')
mystr = ''
for i in range(len(mylist)-1):
if i==0:
mystr += mylist[i+1]
if i>0:
mystr += ','+mylist[i+1]
mystr += ','+latestValue
Run Code Online (Sandbox Code Playgroud)
这在我的代码中运行了数百万次,并且我已将其识别为瓶颈,因此我热衷于优化它以使其运行更快.
这样做最有效(在运行时方面)?
我正在处理包含由行分隔的数据的大型文本文件(~20MB).大多数数据条目是重复的,我想删除这些重复只保留一个副本.
此外,为了使问题稍微复杂一些,重复一些条目并附加额外的信息.在这种情况下,我需要保留包含额外信息的条目并删除旧版本.
我需要离开这个:
__PRE__对此:
__PRE__NB.最后的订单无关紧要.
有效的方法是什么?
我可以使用awk,python或任何标准的linux命令行工具.
谢谢.
在numpy我有一个1和0的2d数组.我需要计算一个新的数组(相同的维度),其中每个元素包含距离掩码数组中相应点最近的1的距离.
例如
a=np.array(
[[1,1,0],
[1,0,0],
[1,0,0]])
Run Code Online (Sandbox Code Playgroud)
我需要b看起来像这样:
array([[0,0,1],
[0,1,1.41],
[0,1,2]])
Run Code Online (Sandbox Code Playgroud)
PS.我将在非常大的阵列上执行此操作,因此效率越高越好!谢谢!
我有数据存储在逗号分隔的txt文件中.其中一列代表日期时间.
我需要将每个列加载到单独的numpy数组中(并将日期解码为python datetime对象).
最快的方法是什么(就运行时而言)?
NB.这些文件是几百MB的数据,目前需要几分钟才能加载.
例如mydata.txt
15,3,0,2003-01-01 00:00:00,12.2
15,4.5,0,2003-01-01 00:00:00,13.7
15,6,0,2003-01-01 00:00:00,18.4
15,7.5,0,2003-01-01 00:00:00,17.9
15,9,0,2003-01-01 00:00:00,17.7
15,10.5,0,2003-01-01 00:00:00,16.3
15,12,0,2003-01-01 00:00:00,17.2
Run Code Online (Sandbox Code Playgroud)
这是我当前的代码(它有效,但很慢):
import csv
import datetime
import time
import numpy
a=[]
b=[]
c=[]
d=[]
timestmp=[]
myfile = open('mydata.txt',"r")
# Read in the data
csv_reader = csv.reader(myfile)
for row in csv_reader:
a.append(row[0])
b.append(row[1])
c.append(row[2])
timestmp.append(row[3])
d.append(row[4])
a = numpy.array(a)
b = numpy.array(b)
c = numpy.array(c)
d = numpy.array(d)
# Convert Time string list into list of Python datetime objects
times = [] …Run Code Online (Sandbox Code Playgroud)