将numpy数组转换为一个完整的numpy数组

时间:2016-02-04 04:37:48

标签: python arrays numpy

我想将我的数组数组转换为单个数组。 来自:

array([ array([[0, 0, 0, ..., 1, 0, 0],
       [0, 1, 0, ..., 0, 0, 0],
       [0, 0, 0, ..., 2, 0, 0],
       ..., 
       array([[0, 0, 0, ..., 0, 0, 0],
       [0, 0, 0, ..., 0, 0, 0],
       [0, 0, 0, ..., 8, 0, 2],
       ..., 
       [0, 0, 0, ..., 0, 0, 0],
       [1, 0, 0, ..., 0, 0, 0],
       [0, 0, 0, ..., 1, 0, 0]], dtype=uint8)], dtype=object)

,其大小(10,)只是尺寸为(10,518,32)的3D numpy数组

array([[[0, 0, 0, ..., 0, 0, 0],
        [0, 0, 0, ..., 0, 0, 0],
        [0, 0, 0, ..., 0, 0, 0],
        ..., 
        [0, 0, 0, ..., 0, 0, 0],
        [0, 0, 0, ..., 0, 0, 0],
        [0, 0, 0, ..., 0, 0, 0]]], dtype=uint8)

我已经尝试将所有内容转换为列表然后执行np.asarray并尝试将所有内容定义为相同的dtype = uint8但我无法将其转换为3D形式。

4 个答案:

答案 0 :(得分:10)

np.concatenate应该这样做:

创建一个数组的对象数组:

In [23]: arr=np.empty((4,),dtype=object)
In [24]: for i in range(4):arr[i]=np.ones((2,2),int)*i
In [25]: arr
Out[25]: 
array([array([[0, 0],
       [0, 0]]), array([[1, 1],
       [1, 1]]),
       array([[2, 2],
       [2, 2]]), array([[3, 3],
       [3, 3]])], dtype=object)

In [28]: np.concatenate(arr)
Out[28]: 
array([[0, 0],
       [0, 0],
       [1, 1],
       [1, 1],
       [2, 2],
       [2, 2],
       [3, 3],
       [3, 3]])

或重塑:

In [26]: np.concatenate(arr).reshape(4,2,2)
Out[26]: 
array([[[0, 0],
        [0, 0]],

       [[1, 1],
        [1, 1]],

       [[2, 2],
        [2, 2]],

       [[3, 3],
        [3, 3]]])
In [27]: _.shape
Out[27]: (4, 2, 2)

concatenate有效地将其输入视为数组列表。因此无论是对象数组,列表还是3d数组,它都可以工作。

这不能简单地通过重塑来完成。 arr是一个指针数组 - 指向位于内存中其他位置的数组。要获得单个3d数组,必须将所有部分复制到一个缓冲区中。这就是连接的作用 - 它会创建一个大的空文件,并复制每个数组,但它是在编译的代码中完成的。

np.array不会改变它:

In [37]: np.array(arr).shape
Out[37]: (4,)

但将arr视为数组列表确实有效(但比concatenate版本慢 - 数组会更多地分析其输入。)

In [38]: np.array([x for x in arr]).shape
Out[38]: (4, 2, 2)

答案 1 :(得分:2)

在从每行包含一个数组的Pandas DataFrame中提取列时,我遇到了同样的问题:

joined["ground truth"].values
# outputs
array([array([0, 0, 0, 0, 0, 0, 0, 0]), array([0, 0, 0, 0, 0, 0, 0, 0]),
       array([0, 0, 0, 0, 0, 0, 0, 0]), ...,
       array([0, 0, 0, 0, 0, 0, 0, 0]), array([0, 0, 0, 0, 0, 0, 0, 0]),
       array([0, 0, 0, 0, 0, 0, 0, 0])], dtype=object)

np.concatenate并没有帮助,因为它将数组合并为平面数组(与np.hstack相同)。相反,我需要将它们与np.vstack垂直堆叠:

array([[0, 0, 0, ..., 0, 0, 0],
       [0, 0, 0, ..., 0, 0, 0],
       [0, 0, 0, ..., 0, 0, 0],
       ...,
       [0, 0, 0, ..., 0, 0, 0],
       [0, 0, 0, ..., 0, 0, 0],
       [0, 0, 0, ..., 0, 0, 0]])

答案 2 :(得分:2)

也许聚会晚了,但是我认为最有效的方法是:

<?php
$straddressee = 'info@myexample.com';
$strFrom       = '"mailer" <dictformmail@myexample.com>';
$strSubject    = 'Message';
$strReturnhtml = 'thankyou.php';
$strDelimiter  = ":\t";

if($_POST)
{
 $strMailtext = "";
 while(list($strName,$value) = each($_POST))
 {
  if(is_array($value))
  {
   foreach($value as $value_array)
   {
    $strMailtext .= $strName.$strDelimiter.$value_array."\n";
   }
  }
  else
  {
   $strMailtext .= $strName.$strDelimiter.$value."\n";
  }
 }

 if(get_magic_quotes_gpc())
 {
  $strMailtext = stripslashes($strMailtext);
 }

 mail($straddressee, $strSubject, $strMailtext, "From: ".$strFrom)
  or die("The email could not be sent.");
 header("Location: $strReturnhtml");
 exit;
}

?>
<!DOCTYPE html>
<html lang="en">
    <body>
    <p>Your message:</p>
<form action="<?php echo htmlentities("/mailer/"); ?>" method="post">

<p>Salutation:<input type="text" name="Salutation" /></p>
<p>Your Name:<input type="text" name="name" /></p>
<p>Your Email:<input type="text" name="email"  size="30"></p>
<p>Subject:<input type="text" name="subject"  size="35"></p>
<p>Your message:<textarea name="Message">message</textarea></p>
      <input type="submit" value="submit" />
</form>
</body>
</html>

给出一些如何工作的想法:

np.array(arr.tolist())

...以及时间:

import numpy as np


N, M, K = 4, 3, 2
arr = np.empty((N,), dtype=object)
for i in range(N):
    arr[i] = np.full((M, K), i)


print(arr)
# [array([[0, 0],
#        [0, 0],
#        [0, 0]])
#  array([[1, 1],
#        [1, 1],
#        [1, 1]])
#  array([[2, 2],
#        [2, 2],
#        [2, 2]])
#  array([[3, 3],
#        [3, 3],
#        [3, 3]])]


new_arr = np.array(arr.tolist())
print(new_arr)
# [[[0 0]
#   [0 0]
#   [0 0]]

#  [[1 1]
#   [1 1]
#   [1 1]]

#  [[2 2]
#   [2 2]
#   [2 2]]

#  [[3 3]
#   [3 3]
#   [3 3]]]

答案 3 :(得分:0)

一种方法是分配目标数组并将对象作为循环复制。

import numpy as np

x = np.array([ np.array([[0, 0, 0, 1, 0, 0],
                         [0, 1, 0, 0, 0, 0],
                         [0, 0, 3, 7, 0, 0],
                         [0, 0, 0, 2, 0, 0]], dtype=np.uint8),
               np.array([[0, 0, 0, 0, 0, 0],
                         [0, 0, 0, 0, 0, 0],
                         [0, 0, 4, 8, 0, 0],
                         [0, 0, 0, 8, 0, 2]], dtype=np.uint8),
               np.array([[0, 0, 0, 0, 0, 0],
                         [1, 0, 0, 0, 0, 0],
                         [0, 0, 5, 9, 0, 0],
                         [0, 0, 0, 1, 0, 0]], dtype=np.uint8)], dtype=object)

print len(x)

print x[0].shape

y=np.zeros([len(x),x[0].shape[0],x[0].shape[1]],dtype=np.uint8)

print y.shape

for i in range(len(x)):
    y[i,:,:] = x[i]

print y

如果我理解你的要求,这是理想的结果:

3
(4L, 6L)
(3L, 4L, 6L)
[[[0 0 0 1 0 0]
  [0 1 0 0 0 0]
  [0 0 3 7 0 0]
  [0 0 0 2 0 0]]

 [[0 0 0 0 0 0]
  [0 0 0 0 0 0]
  [0 0 4 8 0 0]
  [0 0 0 8 0 2]]

 [[0 0 0 0 0 0]
  [1 0 0 0 0 0]
  [0 0 5 9 0 0]
  [0 0 0 1 0 0]]]