【发布时间】:2015-11-28 03:01:27
【问题描述】:
我有 2 个数字列表:a 和 b。 A 是整数类型的节点编号列表,b 是浮点64 类型的 X 坐标列表。我想将这 2 个等长数组 (N) 组合成一个保留数据类型的 Nx2 数组。我稍后在一些布尔测试中使用这个数组,所以我需要第一列是整数。我一直在使用:
nodeID = np.concatenate([[a],[b]]).T
但显然这会将所有内容都转换为浮点数。
谢谢!
【问题讨论】:
我有 2 个数字列表:a 和 b。 A 是整数类型的节点编号列表,b 是浮点64 类型的 X 坐标列表。我想将这 2 个等长数组 (N) 组合成一个保留数据类型的 Nx2 数组。我稍后在一些布尔测试中使用这个数组,所以我需要第一列是整数。我一直在使用:
nodeID = np.concatenate([[a],[b]]).T
但显然这会将所有内容都转换为浮点数。
谢谢!
【问题讨论】:
实现目标的一种方法是使用numpy 的dtype,如http://docs.scipy.org/doc/numpy/reference/arrays.dtypes.html 中所述
>>> import numpy as np
>>> dt = np.dtype([('a', np.int64, 1), ('b', np.float64, 1)])
>>> a = np.array([1,2,3,4], dtype=np.int64)
>>> b = np.array([1.,2.,3.,4.], dtype=np.float64)
>>> ab = np.array(zip(a,b), dtype=dt)
>>> ab[:]['a']
array([1, 2, 3, 4])
>>> ab[:]['b']
array([ 1., 2., 3., 4.])
【讨论】:
您可以在此处使用 zip()。如果只是比较列表a的元素,那么这里有什么问题呢?
a =[1,2,3,4]
b =["Hello", "world", "fellow"]
x=zip(a,b)
print x
for a,b in x:
if a == someThing:
doSomething()
【讨论】:
我假设因为您在标题中提到了一个 2D 列表,所以您想要一个类似于下面的列表,其中每个节点和坐标都保留了它们的类型:
[[node1, coord1], [node2, coord2], ... ]
您可以在没有任何模块的情况下用三行快速完成此操作,同时保留每个变量的类型:
nodeID = []
for i, node in enumerate(a):
nodeID.append([node, b[i]])
因此,您将拥有一个 2D 列表。 2D 列表中的每个元素本身将是另一个列表,其中包含一对节点和一个坐标。由于 Python 对类型不敏感,因此您的节点和坐标的类型都将被保留。您将通过以下方式访问每一对:
pair1 = nodeID[0]
pair2 = nodeID[1]
pairx = nodeID[x]
以及它们的内容:
node1 = nodeID[0[0]]
node2 = nodeID[1[0]]
coord1 = nodeID[0[1]]
coord2 = nodeID[1[1]]
希望这会有所帮助。 :-)
【讨论】:
zip 函数是最简单的方法。简短的例子:
>>> a = [1, 2, 3, 4, 5]
>>> b = [1.1, 2.2, 3.3, 4.4, 5.5]
>>> zip(a,b)
[(1, 1.1), (2, 2.2), (3, 3.3), (4, 4.4), (5, 5.5)]
>>>
如果你想从zip(a,b)得到a,只需写:
>>> [x[0] for x in zip(a, b)]
[1, 2, 3, 4, 5]
一个好主意是从两个列表中制作字典:
>>> keys = [1,2,3,4,5]
>>> values = [1.1,2.2,3.3,4.4,5.5]
>>> dictionary = dict(zip(keys, values))
>>> dictionary
{1: 1.1, 2: 2.2, 3: 3.3, 4: 4.4, 5: 5.5}
但要小心,字典中的顺序并没有保存。从字典中获取数据非常简单:
>>> dictionary.keys()
[1, 2, 3, 4, 5]
>>> dictionary.values()
[1.1, 2.2, 3.3, 4.4, 5.5]
>>> dictionary[1]
1.1
>>>
【讨论】: