diff --git a/include/xtensor/xassign.hpp b/include/xtensor/xassign.hpp
index d30dd6dc9..2f108433c 100644
--- a/include/xtensor/xassign.hpp
+++ b/include/xtensor/xassign.hpp
@@ -1141,6 +1141,8 @@ namespace xt
         std::size_t simd_size = inner_loop_size / simd_type::size;
         std::size_t simd_rest = inner_loop_size % simd_type::size;
 
+        bool e1_is_contiguous = E1::contiguous_layout || e1.is_contiguous();
+
         auto fct_stepper = e2.stepper_begin(e1.shape());
         auto res_stepper = e1.stepper_begin(e1.shape());
 
@@ -1191,7 +1193,7 @@ namespace xt
                 fct_stepper.to_begin();
 
                 // need to step E1 as well if not contigous assign (e.g. view)
-                if (!E1::contiguous_layout)
+                if (!E1::contiguous_layout && !e1_is_contiguous)
                 {
                     res_stepper.to_begin();
                     for (std::size_t i = 0; i < idx.size(); ++i)
@@ -1266,7 +1268,7 @@ namespace xt
                         fct_stepper.to_begin();
 
                         // need to step E1 as well if not contigous assign (e.g. view)
-                        if (!E1::contiguous_layout)
+                        if (!E1::contiguous_layout && !e1_is_contiguous)
                         {
                             res_stepper.to_begin();
                             for (std::size_t i = 0; i < idx.size(); ++i)
@@ -1311,7 +1313,7 @@ namespace xt
                 fct_stepper.to_begin();
 
                 // need to step E1 as well if not contigous assign (e.g. view)
-                if (!E1::contiguous_layout)
+                if (!E1::contiguous_layout && !e1_is_contiguous)
                 {
                     res_stepper.to_begin();
                     for (std::size_t i = 0; i < idx.size(); ++i)