2016-11-19 76 views
1
import numpy as np 
a = np.array([[1,2],[3,4],[5,6]]) 
a = np.reshape(a,(1,6)) 
b = np.array([[1,2.1],[3.5,4],[5,6.8]]) 
b = np.reshape(b,(1,6)) 
c = np.concatenate((a,b)) 

当我串连的数组a和b与np.concatenate。我得到一个float类型的数组。连接后可以保留结果数组的数据类型吗?是否可以保留个人numpy的阵列的数据类型与级联

+2

使用NumPy版本1.11.1,当我执行这些代码行时,我发现数组'c'具有整型dtype。你使用的是哪个版本的NumPy? –

+0

对于我使用numpy 1.11.1 – Jakub

+1

阵列'c'是'np.int64'双重检查'a'和'b'的dtype。 – hpaulj

回答

0

有混合类型......如果我已经正确地读了你,你基本上想要将'a'和'b'的值配对。如果是这种情况,可以将输入数组展平并重新组合,同时保留适当的dtype。这是一种方法,如果您想以不同的方式构建它,则可以更改格式。

import numpy as np 
a = np.array([[1, 2], [3, 4], [5, 6]]) 
a = a.flatten() 
b = np.array([[1, 2.1], [3.5, 4], [5, 6.8]]) 
b = b.flatten() 
dt = a.dtype.descr + b.dtype.descr 
c = np.array(list(zip(a, b)), dtype=dt) 
frmt = """ 
:Array 'a'... {} 
:Array 'b'... {} 
:Combined dtype ... {} 
:Resultant structured array... 
{!r:} 
:Viewed column-wise 
{!r:} 
: 
""" 
print(frmt.format(a, b, dt, c, c.reshape(c.shape[0], 1))) 

输出

:Array 'a'... [1 2 3 4 5 6] 
:Array 'b'... [ 1.000 2.100 3.500 4.000 5.000 6.800] 
:Combined dtype ... [('', '<i8'), ('', '<f8')] 
:Resultant structured array... 
array([(1, 1.0), (2, 2.1), (3, 3.5), (4, 4.0), (5, 5.0), (6, 6.8)], 
     dtype=[('f0', '<i8'), ('f1', '<f8')]) 
:View column-wise 
array([[(1, 1.0)], 
     [(2, 2.1)], 
     [(3, 3.5)], 
     [(4, 4.0)], 
     [(5, 5.0)], 
     [(6, 6.8)]], 
     dtype=[('f0', '<i8'), ('f1', '<f8')]) 
: 

作为替代一切,你可以从 https://github.com/numpy/numpy/blob/master/numpy/lib/recfunctions.py

from numpy.lib import recfunctions as rfn 
a0 = np.array([[1, 2],[3, 4],[5, 6]]) 
b0 = np.array([[1, 2.1],[3.5, 4],[5, 6.8]]) 
d = rfn.merge_arrays((a0, b0), flatten=True, usemask=False, asrecarray=False) 

屈服利用一些可选工具...

>>> c 
array([(1, 1.0), (2, 2.1), (3, 3.5), (4, 4.0), (5, 5.0), (6, 6.8)], 
     dtype=[('f0', '<i8'), ('f1', '<f8')]) 
>>> d 
array([(1, 1.0), (2, 2.1), (3, 3.5), (4, 4.0), (5, 5.0), (6, 6.8)], 
     dtype=[('f0', '<i8'), ('f1', '<f8')]) 
>>> c == d 
array([1, 1, 1, 1, 1, 1], dtype=bool) 

编辑 根据你的意见,看起来你需要考虑你真的想保持数据在一起。一个dtype为'object'的数组是可能的,但可能不是很有用......可能,但不是组织它的最好方法。如果您的意图是存档,请考虑将其保存为* .npz格式。无论如何...

a = np.arange(9).reshape(3,3) 
>>> b = np.arange(9.).reshape(3,3) 
>>> c = np.array(["array a", "array b"]) 
>>> d = np.array([a,b,c], dtype='object') 
>>> d 
array([array([[0, 1, 2], 
     [3, 4, 5], 
     [6, 7, 8]]), 
     array([[ 0.000, 1.000, 2.000], 
     [ 3.000, 4.000, 5.000], 
     [ 6.000, 7.000, 8.000]]), 
     array(['array a', 'array b'], 
     dtype='<U7')], dtype=object) 
+0

我不想配对他们......如果a = [1,2,3]和b = [3,2.4,5.88],那么连接的输出应该是[1,2,3,3,2.4,4 ,5.88]。而我得到的是[1.0,2.0,3.0,3.0,2.4,4.0,5.88] 这是可能的吗? –

+0

你不能混合并得到任何有用的东西...... a = np.array([1,2,3]); b = np.array([3,2.4,5.88]) >>> c = np.array([a,b],dtype ='object') >>> c array [[[1,2, 3], [3.0,2.3999999999999999,5.899999999999999]],dtype = object)重复999s是浮点表示,dtype是对象。也许,您需要详细说明为什么您需要首先将浮点数与整数混合起来 – NaN

+0

我正在创建一个数据集。它会有两个图像和一个以coloumn主要形式的标签。图像具有int值,而标签矩阵可以有十进制值。所以我需要将它们全部存储在一起,并保持完整的类型,一个接一个地提取。我不知道这是否可能。我是一个新手与numpy。 –