使用索引和子索引将值分配给numpy数组

时间:2019-10-25 17:46:42

标签: python numpy numpy-slicing

这咬了我好几次了,我不知道这是错误还是功能。

ini_set('max_execution_time', 1000);
include "config.php";
include  'vendor/mantas-done/subtitles/src/Subtitles.php';
use \Done\Subtitles\Subtitles;
$subtitles = new Subtitles();

$data =  $_POST['data'];
$file_name =  $_POST['file'];
$subtitle =  $_POST['subtitle'];
$language =  $_POST['language'];
$author =  $_POST['author'];
$ip= $_SERVER['REMOTE_ADDR'];
if (array_key_exists('HTTP_X_FORWARDED_FOR', $_SERVER)) {
    $ip = array_pop(explode(',', $_SERVER['HTTP_X_FORWARDED_FOR']));
}


$data =json_decode($data, true);

foreach($data as $obj){

    $subtitles->add($obj['start'], $obj['end'],$obj['text']);
    $subtitles->save($file_name);
}
$ext = pathinfo($file_name, PATHINFO_EXTENSION);

$new_file_name_ext = time()."_".$subtitle."_".$language.".".$ext;
$new_file_name = time()."_".$subtitle."_".$language;
$query1 = "INSERT INTO movies (name , author, language, filename, user_ip)
            VALUES ('$subtitle','$author', '$language', '$new_file_name', '$ip')";
if(mysqli_query($conn, $query1)){
    copy("$file_name", "uploads_iota/$new_file_name_ext");
    //new GoodZipArchive('uploads_iota/$new_file_name',    'upload_iota/output_zip_file.zip') ;
    $data1 = "Successful, File saved to database.";

    $zip = new ZipArchive;
    $new_zip = time()."_".$subtitle."_".$language.".zip";
    if ($zip->open("uploads_zip/$new_zip", ZipArchive::CREATE) === TRUE)
    {
        $zip->addFile("uploads_iota/$new_file_name_ext", "$new_file_name_ext");
        $zip->close();
    }
} else{
    $data1 = mysqli_error();
}

echo $data1; ?>

看来我可以用任何一种方式索引nums = np.arange(10) indx1 = np.array([2,4,6,8]) indx2 = np.array([0,3])

nums

输出nums[indx1][indx2], nums[indx1[indx2]]

如果我想重新分配这些值,这是行不通的

(array([2, 8]), array([2, 8]))

输出nums[indx1][indx2] = 20 nums

但这可以按预期工作:

array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])

输出nums[indx1[indx2]] = 20 nums

为什么我必须嵌套索引数组而不是用菊花链将它们嵌套?

1 个答案:

答案 0 :(得分:0)

这就是我的想法。

尽管以上两种方法返回的结果相同,但是在执行赋值操作时它们是不同的。


nums[indx1][indx2]可以分为两部分temp = nums[indx]temp[indx2]

步骤1。temp = nums[indx1]切片将创建一个 new 数组返回[2 4 6 8]

步骤2。temp[indx2]将返回[2,8]

因此,如果您尝试nums[indx1][indx2] = 20,则相当于

temp = nums[indx1]
print(temp)
temp[indx2] = 20
print(temp)

这不会影响原始数组numsarray([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])


第二种方法为什么起作用?

indx1[indx2]返回[2, 8]

nums[[2,8]] = 20将给您array([ 0, 1, 20, 3, 4, 5, 6, 7, 20, 9])。之所以有效,是因为您将值分配给了原始数组nums

总体而言,第一个无法访问nums的内存,但是第二个可以访问。