diff --git a/python/genericio.cpp b/python/genericio.cpp
index 53df6f5502cec0c448fe6eb2b86e38315c10fc57..a29d478f35d38ecbcf05d88bb8237410cc05dcaf 100644
--- a/python/genericio.cpp
+++ b/python/genericio.cpp
@@ -8,6 +8,7 @@
 #include <map>
 #include <cstdint>
 #include <optional>
+#include <stdexcept>
 
 #ifndef GENERICIO_NO_MPI
 #include <mpi.h>
@@ -119,6 +120,10 @@ public:
     std::map<std::string, py::array> result;
 
     for(const std::string& var_name: *var_names) {
+      // check if it's not already defined (caused some segfaults at some point)
+      if(result.count(var_name)) {
+        throw std::invalid_argument(std::string("variable name was passed multiple times: ") + var_name);
+      }
       auto varp = std::find_if(
         variables.begin(),
         variables.end(),
@@ -127,24 +132,28 @@ public:
       if (varp != variables.end()) {
         // extra space
         py::ssize_t readsize = num_elem + requestedExtraSpace()/(*varp).ElementSize;
+        // py::array_t constructor: (shape, stride) -> some compilers or numpy
+        // versions require stride to be explicitly specified
         if((*varp).IsFloat && (*varp).ElementSize == 4) {
-          result[var_name] = py::array_t<float>(readsize);
+          result[var_name] = py::array_t<float>({readsize}, {4});
           addVariable(*varp, result[var_name].mutable_data(), gio::GenericIO::VarHasExtraSpace);
         } else if((*varp).IsFloat && (*varp).ElementSize == 8) {
-          result[var_name] = py::array_t<double>(readsize);
+          result[var_name] = py::array_t<double>({readsize}, {8});
           addVariable(*varp, result[var_name].mutable_data(), gio::GenericIO::VarHasExtraSpace);
         } else if(!(*varp).IsFloat && (*varp).ElementSize == 4) {
-          result[var_name] = py::array_t<int32_t>(readsize);
+          result[var_name] = py::array_t<int32_t>({readsize}, {4});
           addVariable(*varp, result[var_name].mutable_data(), gio::GenericIO::VarHasExtraSpace);
         } else if(!(*varp).IsFloat && (*varp).ElementSize == 8) {
-          result[var_name] = py::array_t<int64_t>(readsize);
+          result[var_name] = py::array_t<int64_t>({readsize}, {8});
           addVariable(*varp, result[var_name].mutable_data(), gio::GenericIO::VarHasExtraSpace);
         } else if(!(*varp).IsFloat && (*varp).ElementSize == 2) {
-          result[var_name] = py::array_t<uint16_t>(readsize);
+          result[var_name] = py::array_t<uint16_t>({readsize}, {2});
           addVariable(*varp, result[var_name].mutable_data(), gio::GenericIO::VarHasExtraSpace);
         } else {
-          throw std::runtime_error(std::string("Unknown data type in GenericIO for variable ") + var_name);
+          throw std::runtime_error(std::string("unknown data type in GenericIO for variable: ") + var_name);
         }
+      } else { // variable not found
+        throw std::invalid_argument(std::string("requested variable is not defined in GenericIO file: ") + var_name);
       }
     }